简体   繁体   English

EFCore 3:如何在服务器端比较字符串列

[英]EFCore 3: How to compare string columns on server side

I want to effectively get results from this query.我想有效地从此查询中获取结果。

// Get all people whose name starts with F or later alphabets // 获取所有名字以 F 或更高字母开头的人

Select * from MyTable where PersonName >'F' Select * 来自 MyTable where PersonName >'F'

When i run this code using Entity Framework Core 3.0,当我使用 Entity Framework Core 3.0 运行此代码时,

                 context.MyTable 
                 .Where(t=>  String.Compare(t.PersonName ,"F")>0);

I got error,我有错误,

query could not be translated.无法翻译查询。 Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly by inserting a call to either AsEnumerable(), AsAsyncEnumerable(), ToList(), or ToListAsync()以可翻译的形式重写查询,或通过插入对 AsEnumerable()、AsAsyncEnumerable()、ToList() 或 ToListAsync() 的调用显式切换到客户端评估

My current work around is to use FromSQL method and write my own sql.我目前的工作是使用 FromSQL 方法并编写我自己的 sql。 Is there any way to achieve the same using LINQ syntax?有没有什么方法可以使用 LINQ 语法来实现相同的目标?

From Microsoft's doc Where来自微软的文档Where

The query represented by this method is not executed until the object is enumerated either by calling its GetEnumerator method directly此方法表示的查询在 object 通过直接调用其 GetEnumerator 方法枚举之前不会执行

You should call method ToList() or ToListAsync() after Where for forces immediate query evaluation您应该在 Where for 强制立即查询评估之后调用方法 ToList() 或 ToListAsync()

In your code在您的代码中

context.MyTable
             .TakeWhile(t => t.PersonName.First() > 'F')
             .ToList(); 

Best solution for最佳解决方案

Get all people whose name starts with F or later alphabets获取所有姓名以 F 或更高字母开头的人

    context.MyTable
             .OrderBy(t => t.PersonName)
             .SkipWhile(t => t.PersonName.First() < 'F')
             .ToList();

Take care with Upper and lower case注意大小写

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM