【问题标题】:EFCore 3: How to compare string columns on server sideEFCore 3:如何比较服务器端的字符串列
【发布时间】: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)。
  • 你也可以试试stackoverflow.com/questions/59090817/…的解决方案

标签: c# linq ef-core-3.0


【解决方案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?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-12
  • 2019-09-19
  • 2013-11-26
  • 1970-01-01
  • 2012-06-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多