EFCore 3:如何比较服务器端的字符串列
Posted
技术标签:
【中文标题】EFCore 3:如何比较服务器端的字符串列【英文标题】:EFCore 3: How to compare string columns on server side 【发布时间】:2020-04-21 02:59:20 【问题描述】:我想有效地从此查询中获取结果。
// 获取所有名字以F或更高字母开头的人
Select * from MyTable where PersonName >'F'
当我使用 Entity Framework Core 3.0 运行此代码时,
context.MyTable
.Where(t=> String.Compare(t.PersonName ,"F")>0);
我有错误,
无法翻译查询。要么重写查询的形式 可以翻译,或通过以下方式显式切换到客户评估 插入对 AsEnumerable()、AsAsyncEnumerable() 的调用, ToList() 或 ToListAsync()
我目前的工作是使用 FromSQL 方法并编写我自己的 sql。有什么方法可以使用 LINQ 语法实现相同的功能?
【问题讨论】:
尝试使用 String.Contains 而不是 String.Compare。 您的目标是什么数据库类型?因为示例查询适用于 SqlServer(尝试了最新的 EFC 3.1.3 和 EFC 3.0.0)。 你也可以试试***.com/questions/59090817/…的解决方案 【参考方案1】:来自微软的文档Where
此方法表示的查询在直接调用其 GetEnumerator 方法枚举对象之前不会执行
您应该在 Where 之后调用方法 ToList() 或 ToListAsync() 以强制立即查询评估
在您的代码中
context.MyTable
.TakeWhile(t => t.PersonName.First() > 'F')
.ToList();
最佳解决方案
获取所有名字以 F 或更高字母开头的人
context.MyTable
.OrderBy(t => t.PersonName)
.SkipWhile(t => t.PersonName.First() < 'F')
.ToList();
注意大小写
【讨论】:
链接文档可能会更好。我已经为你添加了Where
。
我尝试了这段代码并得到了这个错误(不知道为什么生成的查询将我的列转换为 int)代码 var batch = await context.MyTable .OrderBy(t => t.PersonName) .SkipWhile( t => t.PersonName.First() .OrderBy(t => t.PersonName) .SkipWhile(t => (int)t.PersonName .AsQueryable() .First()
如何声明MyTable及其属性PersonName?以上是关于EFCore 3:如何比较服务器端的字符串列的主要内容,如果未能解决你的问题,请参考以下文章
Oracle:比较两个不同表中没有主键的字符串列以查找匹配/不匹配的字符串