我试图做那样的事情:
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应用于数据库中的字段名称。
有人知道我该怎么做。
谢谢, 问候!
答案 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。因此,如果您需要从数据库执行此逻辑,那么您可能应该创建存储过程,否则您需要将所有记录存储到内存中,然后应用此过滤。