LINQ to Entities无法使用某些功能?

Kro*_*oss 0 c# linq entity-framework

我正在尝试使用LINQ查询在项目上实现搜索功能.因为数据有时包含带有重音符号和其他符号的字符,所以我创建了一种方法来删除这些符号以进行搜索.

这是我的代码:

var addresses = (from a in db.Addresses
                 join b in db.Addresses on a.ClientID equals b.ClientID
                 where a.AddressType == 1 && b.AddressType == 2
                 select new
                 {
                     /* Columns selected */
                 });
var q = (from e in db.Employers
         join a in addresses on e.EmployerID equals a.id
         join i in db.IndustrialSectors on e.IndustrialSector equals i.ID
         select new
         {
             /* Columns selected */
         });

if (search != "")
{
    q = (from i in q
         where (
           Util.StringUtil.RemoveDiacritics(i.entity.ToString().ToLowerInvariant()).Contains(search) ||
           Util.StringUtil.RemoveDiacritics(i.name.ToString().ToLowerInvariant()).Contains(search)
         )
         select i);
}
Run Code Online (Sandbox Code Playgroud)

它会生成一个异常,说明LINQ to Entities无法识别我的方法(RemoveDiacritics(String)).

Cra*_* W. 6

当您使用LINQ-to-Entities时,您的LINQ查询需要转换为"服务器端表达式",在英语中表示数据库可以执行的操作.数据库对您调用的C#方法一无所知,RemoveDiacritics因此您在运行时遇到错误.

您需要先执行查询,然后使用LINQ-to-Objects进行过滤.这可以简单地通过ToList()在过滤之前向查询添加a 来完成.我对流利的语法稍微熟悉一点,所以我把它写成:

q.ToList().Where(i =>
    Util.StringUtil.RemoveDiacritics(i.entity.ToString().ToLowerInvariant()).Contains(search) ||
    Util.StringUtil.RemoveDiacritics(i.name.ToString().ToLowerInvariant()).Contains(search));
Run Code Online (Sandbox Code Playgroud)

如果你想要查询语法,你将不得不搞砸它.它可能类似于以下但我不是100%肯定.

(from i in q.ToList()
 where Util.StringUtil.RemoveDiacritics(i.entity.ToString().ToLowerInvariant()).Contains(search) ||
       Util.StringUtil.RemoveDiacritics(i.name.ToString().ToLowerInvariant()).Contains(search));
Run Code Online (Sandbox Code Playgroud)

但请注意,这将从服务器返回所有内容,然后执行客户端过滤,这可能会导致系统出现性能问题,具体取决于表中包含的信息量.