Тип узла выражения LINQ 'Invoke' не поддерживается в LINQ to Entities - PullRequest
3 голосов
/ 08 апреля 2011

Я пытаюсь реализовать предложение 'IN' в моем EF-запросе с помощью лямбда-выражения следующим образом:

        /*lambda expression to evaluate: status in[a, b, c...n]*/
        _IN myIN = (allStatus, status) =>
        {
            bool lambdaResult = false;
            foreach (int s in statuses)
            {
                if (status == s)
                {
                    lambdaResult = true;
                    break;
                }
            }
            return lambdaResult;
        };

        result = (from v in _entity.CAVouchers
                  join vs in _entity.CAVoucherStatus.Where(vs => (myIN(statuses, vs.VoucherStatusId) == true)) on v.VoucherStatusId equals vs.VoucherStatusId
                  join vsr in _entity.CAVoucherStatusReason on v.VoucherStatusReasonId equals vsr.VoucherStatusReasonid
                  where v.CyberAgent.CAID == caid                       
                  select new ACPVoucher() 
                  {
                      ...
                  }).ToList();

Это выдает ошибку «Тип вызова LINQ« Invoke »не поддерживается в LINQ to Entities» из-за условия «где». По сути, мне нужен пункт «где statusId в [1, 2, 3]».

Что не получается? ... какие-нибудь советы, как это сделать? Тот же подход работает для меня, когда применяется к универсальному списку.

Спасибо

Ответы [ 3 ]

3 голосов
/ 08 апреля 2011

Вы можете просто выполнить запрос на добавление:

where statuses.Contains(vs.VoucherStatusId)
1 голос
/ 08 апреля 2011

Можете ли вы попробовать это?

join vs in _entity.CAVoucherStatus.Where(vs => statuses.Contains(vs.VoucherStatusId)) on v.VoucherStatusId equals vs.VoucherStatusId
0 голосов
/ 08 апреля 2011

Различные поставщики LINQ поддерживают разные приемы;как это происходит LINQ-to-SQL работает с invoke.EF: не так много.Если вы создаете выражение вручную, вам может потребоваться либо сформировать выражение без вызова , либо использовать переписывающее устройство, чтобы сгладить его.Вот пример переписывающего устройства, который иллюстрирует, как это сделать: Объединение двух лямбда-выражений в c #

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