2017-10-06 33 views
0

我在使用EntityFrameworkCore 2.0設置爲獨特的SQLite的實體UnitType屬性Name具有EntityFrameworkCore唯一列的Sqlite區分大小寫。搜索也區分大小寫

modelBuilder.Entity<UnitType>().HasIndex(t => t.Name).IsUnique(); 

但它表現爲區分大小寫。意味着它認爲Gramgram作爲兩個不同的價值觀和做插入。這顯然不是我在MS-SQL上花費大量時間後所期待的。

此外,另一個問題是在此列上過濾數據時。即使這是區分大小寫的。

db.Units.Where(w => w.Name.Contains(SearchText)); 

如何使其不區分大小寫?

回答

2

的SQLite的默認行爲是區分大小寫的。

爲了使一列不區分大小寫,整理NOCASE需要使用。

所以我們還需要添加這一行。

modelBuilder.Entity<UnitType>().Property(t => t.Name).HasColumnType("TEXT COLLATE NOCASE"); 

這將確保Gramgram被理解爲相同的值,因此唯一約束會限制一個插入如果其它已經存在。

要過濾有兩種方法。

1)轉換都列值和搜索文本要麼小寫或大寫字母。

db.Units.Where(w => w.Name.ToLowerInvariant().Contains(SearchText.ToLowerInvariant())); 

2)使用LIKE關鍵字與通配符代替含有

db.Units.Where(w => EF.Functions.Like(w.Name, $"%{SearchText}%")); 

另外,我還讀的地方,轉換列,以降低或上會導致數據庫引擎的所有值轉換列,這可能是大數據集上的性能瓶頸。所以我建議使用第二種方法。

+0

對於SQLite的區分大小寫的搜索也看到了這個問題:https://stackoverflow.com/questions/15480319/case-sensitive-and-insensitive-like-in-sqlite –