При попытке выполнить запрос linq появляется следующая ошибка:
LINQ to Entities не распознает метод Boolean IsCharityMatching (System.String, System.String), и этот метод нельзя преобразовать в выражение хранилища.
Я читал много предыдущих вопросов, где люди получают ту же ошибку, и если я правильно это понимаю, это потому, что LINQ to Entities требует, чтобы все выражение запроса linq было преобразовано в запрос сервера, и поэтому вы не можете вызвать внешний метод в этом. Мне еще не удалось превратить свой сценарий во что-то, что работает, и мой мозг начинает таять, поэтому я надеялся, что кто-то может указать мне правильное направление. Мы используем Entity Framework и шаблон спецификации (и я новичок в обоих).
Вот код, который использует спецификацию:
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;
}
Дайте мне знать, если вам понадобится дополнительная информация.
Большое спасибо,
Аннели
Find()
когда используетеIsSatisfied()
внутри него.Ответы:
Как вы уже выяснили, Entity Framework не может выполнять ваш код C # как часть своего запроса. Он должен иметь возможность преобразовывать запрос в фактический оператор SQL. Чтобы это сработало, вам нужно будет преобразовать выражение запроса в выражение, которое может обрабатывать Entity Framework.
источник
Expression<Func<T,type>>
- очень хороший подход к этому.context.Where(IsSatisfied())
У меня такая же ошибка в этом коде:
это была именно ошибка:
Я решил так:
Я добавил .ToList () перед своей таблицей, это отделяет код Entity и linq и позволяет избежать перевода следующего выражения linq
ПРИМЕЧАНИЕ: это решение не оптимально, потому что избегает фильтрации сущностей и просто загружает всю таблицу в память.
источник
Если кто-то ищет ответ VB.Net (как и я изначально), вот он:
источник
У меня была проблема, похожая на вашу, и эта документация LINQ помогла мне найти правильные строковые функции для обхода ограничений.
источник