sqlite - Sqlite EF Core 5 不允许我进行不区分大小写的搜索
问题描述
因此,我尝试使用 ef-core 进行 linq 查询来进行 where 搜索,但无论我尝试了什么,我都无法让它进行不区分大小写的搜索。
例如,如果我搜索“星期二”,它不会获取任何数据,因为数据库中的所有内容都保存为“星期二”。
搜索后,我发现您必须通过 ef core migrations 告诉 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不区分大小写查询的整个概念?
解决方案
不幸的是,提供的答案对我不起作用。以下是如何将所有公开模型的所有属性迭代string
到 EF-Core 并将它们的默认排序规则设置为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();
}
推荐阅读
- flutter - 使用 Android 后退按钮重新启动应用程序后热重载失败?
- git - Git本地配置不覆盖全局配置
- rascal - 查找 Java 语法
- java - 构造 MimeMessage 时出现 FolderClosedException
- javascript - JavaScript 不会阻止 DOM 构建
- c - C语言中的按位运算(0x80、0xFF、<<)
- php - Mamp PHP 空白页
- c++ - deque 迭代器在调试模式下不可取消引用错误
- python - 如何替换打印以避免在输出中打印 NONE?
- javascript - 为什么从另一个方法调用方法时出现“TypeError:this.X is not a function”?