2017-08-09 78 views
-1

我試圖做somethig這樣的:C# - LINQ到實體無法識別方法

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

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

而且我得到這個錯誤:LINQ到實體無法識別方法RemoveDiacritics。

我需要將方法RemoveDiacritics應用到數據庫的字段名稱。

有人知道我該怎麼做。

謝謝, 問候!

+0

您必須首先獲取數據,然後調用自定義方法來過濾。哪個效率不高。因此,您需要找到如何在不調用表數據的自定義函數的情況下搜索數據。 – Harsh

回答

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的值的值延長你的人表( ).RemoveDiacritics()

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

每當你的模型添加或更新的人對象,確保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)); 
+0

感謝先驅報,非常有用您的評論。我用你建議的方式解決了我的問題。最好的祝福! – pleongomez

0

這是不可能的,因爲EF不知道如何將'RemoveDiacritics'方法轉換爲SQL。所以如果你需要從數據庫做這個邏輯,那麼也許你應該創建存儲過程,否則你需要獲取所有記錄到內存然後應用這個過濾。

相關問題