LINQ to Entities не распознает метод - PullRequest
104 голосов
/ 31 августа 2011

Я получаю следующую ошибку при попытке выполнить запрос 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;
}

Дайте мне знать, если вам нужна дополнительная информация.

Большое спасибо,

Annelie

Ответы [ 3 ]

112 голосов
/ 31 августа 2011

Как вы уже поняли, 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()));
}
0 голосов
/ 02 апреля 2019

У меня была проблема, похожая на вашу, и эта документация LINQ помогла мне найти правильные строковые функции, чтобы обойти ограничения.

0 голосов
/ 14 января 2019

Я получил ту же ошибку в этом коде:

 var articulos_en_almacen = xx.IV00102.Where(iv => alm_x_suc.Exists(axs => axs.almacen == iv.LOCNCODE.Trim())).Select(iv => iv.ITEMNMBR.Trim()).ToList();

Это была именно ошибка:

System.NotSupportedException: «LINQ to Entities не распознает метод»Логический метод Exists (System.Predicate`1 [conector_gp.Models.almacenes_por_sucursal]) ', и этот метод нельзя преобразовать в выражение хранилища.'

Я решил следующим образом:

var articulos_en_almacen = xx.IV00102.ToList().Where(iv => alm_x_suc.Exists(axs => axs.almacen == iv.LOCNCODE.Trim())).Select(iv => iv.ITEMNMBR.Trim()).ToList();

Я добавил .ToList () перед моей таблицей, это разъединяет код Entity и linq и предотвращает перевод следующего выражения linq

ПРИМЕЧАНИЕ: это решение не является оптимальным, поскольку избегает фильтрации сущностей и просто загружает всю таблицу в память

...