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:比较两个不同表中没有主键的字符串列以查找匹配/不匹配的字符串

MySQL字符串列与整数比较

Spark将布尔列与字符串列进行比较与比较值相等的int和字符串的工作方式不同

在android房间数据库中连接两个字符串列

如何在pyspark中将字符串列转换为ArrayType

如何在poedit中编辑原始字符串列?