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

时间:2015-02-27 15:33:48

标签: 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);
}

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

1 个答案:

答案 0 :(得分:6)

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

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

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

如果你想要查询语法,你将不得不搞砸它。它可能类似于以下内容,但我不是百分百肯定。

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

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