Dot-Net
LINQ to Entities 無法辨識該方法
嘗試執行 linq 查詢時出現以下錯誤:
LINQ to Entities 無法辨識“Boolean IsCharityMatching(System.String, System.String)”方法,並且該方法無法轉換為儲存表達式。
我讀過很多以前的問題,人們會遇到同樣的錯誤,如果我理解正確,那是因為 LINQ to Entities 需要將整個 linq 查詢表達式轉換為伺服器查詢,因此您不能呼叫外部方法在裡面。我還沒有能夠將我的場景轉換成可行的東西,而且我的大腦開始崩潰,所以我希望有人能指出我正確的方向。我們正在使用實體框架和規範模式(我對這兩者都很陌生)。
這是使用規範的程式碼:
ISpecification<Charity> specification = new CharitySearchSpecification(charityTitle, charityReference); charities = charitiesRepository.Find(specification).OrderBy(p => p.RegisteredName).ToList();這是 linq 表達式:
public System.Linq.Expressions.Expression<Func<Charity, bool>> IsSatisfied() { return p => p.IsCharityMatching(this.charityName, this.charityReference); }這是 IsCharityMatching 方法:
public bool IsCharityMatching(string name, string referenceNumber) { bool exists = true; if (!String.IsNullOrEmpty(name)) { if (!this.registeredName.ToLower().Contains(name.ToLower()) && !this.alias.ToLower().Contains(name.ToLower()) && !this.charityId.ToLower().Contains(name.ToLower())) { exists = false; } } if (!String.IsNullOrEmpty(referenceNumber)) { if (!this.charityReference.ToLower().Contains(referenceNumber.ToLower())) { exists = false; } } return exists; }如果您需要更多資訊,請告訴我。
非常感謝,
安妮莉
正如您所知道的,Entity Framework 實際上不能將您的 C# 程式碼作為其查詢的一部分執行。它必須能夠將查詢轉換為實際的 SQL 語句。為了使其工作,您必須將查詢表達式重組為 Entity Framework 可以處理的表達式。
public System.Linq.Expressions.Expression<Func<Charity, bool>> IsSatisfied() { string name = this.charityName; string referenceNumber = this.referenceNumber; return p => (string.IsNullOrEmpty(name) || p.registeredName.ToLower().Contains(name.ToLower()) || p.alias.ToLower().Contains(name.ToLower()) || p.charityId.ToLower().Contains(name.ToLower())) && (string.IsNullOrEmpty(referenceNumber) || p.charityReference.ToLower().Contains(referenceNumber.ToLower())); }