Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#-LINQ to实体无法识别该方法_C#_Linq - Fatal编程技术网

C#-LINQ to实体无法识别该方法

C#-LINQ to实体无法识别该方法,c#,linq,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方法

我正试着做这样的事情:

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方法

有人知道我是怎么做到的

谢谢,
问候

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

您必须知道

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

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

这意味着您不能使用自己的函数,如RemoveDiacritics

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

如果查询不经常进行,并且不必以光速进行,那么添加一个numerable()就足够了

如果查询非常频繁,而且必须非常快,请考虑扩展您的人名表,该值包含No.ToupPipe()、RevEdidiaCurrx()/P> 每当您的模型添加或更新人员对象时,请确保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));

您必须首先获取数据,然后调用自定义方法进行筛选。这是没有效率的。因此,您需要找到如何在不调用表数据的自定义函数的情况下搜索数据。感谢Herald,您的评论非常有用。我用你建议的方法解决了我的问题。顺致敬意,
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));