LINQ to Entities не распознает метод

При попытке выполнить запрос linq возникает следующая ошибка:

LINQ to Entities не распознает метод «Boolean IsCharityMatching (System.String, System.String)», и этот метод не может быть переведен в выражение хранилища.

Я прочитал много предыдущих вопросов, когда люди получают ту же ошибку, и если я правильно понимаю это, потому что LINQ to Entities требует, чтобы все выражение запроса linq было переведено на серверный запрос, и поэтому вы не можете вызвать внешний метод в этом. Я не смог преобразовать свой сценарий в то, что работает, и мой мозг начинает таять, поэтому я надеялся, что кто-то может указать мне в правильном направлении. Мы используем Entity Framework и шаблон спецификации (и я новичок в обоих).

Вот код, который использует спецификацию:

ISpecification specification = new CharitySearchSpecification(charityTitle, charityReference); charities = charitiesRepository.Find(specification).OrderBy(p => p.RegisteredName).ToList(); 

Вот выражение linq:

 public System.Linq.Expressions.Expression<Func> 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> 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())); } 
Давайте будем гением компьютера.