LINQ to Entities不能识别该方法
试图执行linq查询时出现以下错误:
LINQ to Entities不识别方法'布尔IsCharityMatching(System.String,System.String)'方法,并且此方法不能被转换为存储expression式。
我读过很多以前的问题,人们得到相同的错误,如果我正确地理解这是因为LINQ to Entities要求整个LINQ查询expression式被转换为服务器查询,因此你不能调用一个外部方法在里面。 我还没有能够把我的情景转化成现在可行的东西,我的大脑开始融化,所以我希望有人能够指引我正确的方向。 我们正在使用entity framework和规范模式(我是新来的)。
以下是使用规范的代码:
ISpecification<Charity> specification = new CharitySearchSpecification(charityTitle, charityReference); charities = charitiesRepository.Find(specification).OrderBy(p => p.RegisteredName).ToList();
这里是linqexpression式:
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; }
让我知道如果你需要更多的信息。
非常感谢,
Annelie
正如你已经知道的那样,Entity Framework实际上不能运行你的C#代码作为查询的一部分。 它必须能够将查询转换为实际的SQL语句。 为了达到这个目的,你将不得不把你的查询expression式重构成Entity Framework可以处理的expression式。
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())); }