C# - LINQ to Entities无法识别该方法

时间:2017-08-09 10:01:16

标签: c# linq

我试图做那样的事情:

string queryText = searchtext.ToUpper().RemoveDiacritics();

var result = from p in People
             where p.Name.ToUpper().RemoveDiacritics().Contains(queryText)
             select p;

我收到此错误:LINQ to Entities无法识别RemoveDiacritics方法。

我需要将方法RemoveDiacritics应用于数据库中的字段名称。

有人知道我该怎么做。

谢谢, 问候!

2 个答案:

答案 0 :(得分:1)

您必须了解difference between IEnumerable and IQueryable

IQueryable的优点是你的查询将由IQueryable的prodiver执行,它通常是一个数据库。将数据从数据库传输到本地内存是一个相对较慢的过程,因此最好通过让数据库尽可能多地限制必须传输的数据。

IQueryable的缺点是它只知道提供者的功能。如果是SQL,请检查

列表

Supported and Unsupported LINQ Methods (LINQ to Entities)

这意味着您无法使用自己的功能,例如RemoveDiacritics。

您的问题的解决方案取决于您执行此查询的频率,以及此查询是否必须执行得非常快

如果查询不经常完成且不必处于光速状态,则添加AsEnumerable()

就足够了
var result = People
    .AsEnumerable()
    .Where(p => p.Name.ToUpper().RemoveDiacritics()....);

如果您的查询经常进行并且必须非常快,请考虑使用包含Name.ToUpper()值的值扩展People表.RemoveDiacritics()

class People
{
   public string Name {get; set;}
   public string NameWithoutDiacritics {get; set;}
   ...
}

每当您的模型添加或更新People对象时,请确保NameWithoutDiacritics包含正确的值

public void Update(People people)
{
     using (var dbContext = new MyDbContext())
     {
          var foundPeople = people.Find(people.Id);
          foundPeople.Name = people.Name;
          foundPeople.NameWithoutDiacritics = people.Name
               .ToUpper()
               .RemoveDiacritics();
          ...
          dbContext.SaveChanges();
     }
}

更改您的查询:

var result = People.Where(p => p.NameWithoutDiacritics.Contains(queryText));

答案 1 :(得分:0)

这是不可能的,因为EF不知道如何将“RemoveDiacritics”方法转换为SQL。因此,如果您需要从数据库执行此逻辑,那么您可能应该创建存储过程,否则您需要将所有记录存储到内存中,然后应用此过滤。