所以我尝试使用 ef-core 进行 linq 查询来执行 where 搜索,但无论我尝试什么,我都无法让它执行不区分大小写的搜索。
例如,如果我搜索“星期二”,它不会获取任何数据,因为数据库中的所有内容都保存为“星期二”。
搜索后我发现你必须通过 ef core 迁移告诉 sqlite 你希望它对每个属性不区分大小写,如下代码。
b.Property<string>("DayOfWeek")
.HasColumnType("TEXT COLLATE NOCASE");
该信息位于 ContextModelSnapshot.cs 文件中。
所以我这样做了,删除了数据库并执行了“更新数据库”,创建了一个新数据库,但没有任何改变。
现在我当然可以在每次搜索中使用
.ToLower()
,但如果我忘记将其添加到每个 where 子句,这只会影响性能并增加失败的可能性。
我使用以下软件包进行数据库创建、迁移和访问。
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="5.0.1">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="5.0.1" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="5.0.1" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="5.0.1">
我错过了什么或者我误解了 sqlite 不区分大小写查询的整个概念?
不幸的是,提供的答案对我不起作用。以下是如何迭代 EF-Core 中所有公开模型的所有
string
属性,并将其默认排序规则设置为 nocase
:
public static void SetCaseInsensitiveSearchesForSQLite(this ModelBuilder modelBuilder)
{
if (modelBuilder == null)
{
throw new ArgumentNullException(nameof(modelBuilder));
}
modelBuilder.UseCollation("NOCASE");
foreach (var property in modelBuilder.Model.GetEntityTypes()
.SelectMany(t => t.GetProperties())
.Where(p => p.ClrType == typeof(string)))
{
property.SetCollation("NOCASE");
}
}
然后这样称呼它:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
if (modelBuilder == null)
{
throw new ArgumentNullException(nameof(modelBuilder));
}
modelBuilder.SetCaseInsensitiveSearchesForSQLite();
}
您可以使用以下代码将属性配置为不区分大小写。
在您的情况下:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.UseCollation("BINARY");
modelBuilder.Entity<Entry>().Property(c => c.DayOfWeek)
.UseCollation("NOCASE");
}
通过此设置,
DayOfWeek
将不区分大小写,而其他列仍会区分。
经过大量测试,我终于发现了我的错误。
事实证明,您所需要的只是将 OnModelCreating 中的排序规则更改为 NOCASE,突然间它就像一个魅力无处不在。
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.UseCollation("NOCASE");
}