"Невозможно создать постоянное значение типа." Как избежать этой ошибки в запросе LINQ? - PullRequest
0 голосов
/ 23 февраля 2012

У меня есть этот метод:

public virtual IEnumerable<Invoice> GetHomePageInvoices(IList<Area> areas, FinancialYearLookup financialYear)
{
    var homePageInvoices = _db.Invoices.Where(x => areas.Any(z => z.Id == 3)).ToList();

    ...
}

В основном я пытаюсь найти любые счета, где область совпадает с любой из этих в области параметров.

Я получаю ошибку:

Невозможно создать постоянное значение типа 'Models.Area'. Только примитивные типы (такие как Int32, String и Guid) поддерживаются в этот контекст.

Может кто-нибудь объяснить, почему это происходит и как это исправить?

Ответы [ 2 ]

5 голосов
/ 23 февраля 2012

Вы не можете использовать IList<Area> в контексте вашего провайдера Linq (предположительно Linq to Entities) - просто извлеките идентификаторы заранее и используйте запрос Contains, который работает с коллекцией примитивов:

List<int> ids = areas.Select( x=> x.Id).ToList();
var homePageInvoices = _db.Invoices
                          .Where(x => ids.Contains(x.Id))
                          .ToList();

Также я предполагаю, что вы не хотите сравнивать с фиксированным значением 3 - поэтому я изменил ваш запрос соответствующим образом - при условии, что у сущности Invoice есть свойство Id.

0 голосов
/ 23 февраля 2012

а.Похоже, у вас есть опечатка здесь:

z => z.Id == 3

, но главная проблема - это b.Я предполагаю, что вы используете Linq для Entities, но это не ясно.В любом случае происходит то, что построитель запросов пытается превратить эти области. «.Ny (...)» в SQL, и не может этого сделать, поскольку области - это не IQueryable из вашей базы данных, а локальная переменная.Я предлагаю вам использовать что-то вроде этого, где пользовательский оператор Linq, как описано здесь или здесь .Это создаст предложение SQL in, содержащее все элементы в областях, с которыми вы, возможно, захотите сравнить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...