Ошибка метода System.Linq.Select: LINQ to Entities не распознает метод - PullRequest
2 голосов
/ 06 марта 2012

Добрый день,

Мой код генерирует ошибку во время выполнения, и я не уверен, как это исправить.Мы будем благодарны за любую помощь.

Наш код вызывает второй метод преобразования ниже, передавая список «предложений».Предложение является объектом модели EDMX.Первый метод Convert берет объект и преобразует его в класс DTO, который затем возвращает обратно.

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

LINQ to Entities делаетне распознается метод метода "... Domain.Holdings.OfferDto Convert (... Repository.Offer, System.Nullable`1 [System.Int32])", и этот метод нельзя преобразовать в выражение хранилища.

Код выглядит следующим образом:

public class OfferDtoMapping
{
    public static OfferDto Convert(Offer offer, int? participantId)
    {
        if (offer == null)
            throw new ArgumentException("The Offer object supplied for conversion cannot be null");

        var unitCost = offer.UnitCost;
        if (offer.Trust.Company.AllowInterDiv && participantId.HasValue)
        {
            Assign another value to unitCost...
        }

        var output = new OfferDto
        {               
            Assign the offer properties to the OfferDto properties...
        };
        return output;        
    }

    public static IList<OfferDto> Convert(IQueryable<Offer> offerList)
    {
        return offerList == null ? new List<OfferDto>() : offerList.Select(ol => Convert(ol, null)).ToList();
    }
}

Ошибка в этой строке:

 return offerList == null ? new List<OfferDto>() : offerList.Select(ol => Convert(ol, null)).ToList();

Я подозреваю, что ошибка связана с тем, что япроецирование offerList над методом, принимающим 2 входных параметра.Мы попытались передать 0 вместо NULL (потому что изначально думали, что это проблема), но все равно получили похожее сообщение об ошибке.

Чтобы сохранить согласованность в нашем решении, мы хотим продолжать использовать метод Select вместо заменыэто с помощью оператора foreach.

Есть ли способ использовать метод Select в нашей текущей ситуации?

Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 06 марта 2012

Вы не можете вызывать методы из linq2entities, вы можете сделать это в linq2object, поэтому сначала получите ваши данные, а затем вызовите метод:

   return offerList == null ? new List<OfferDto>() : offerList.ToList()
                                                    .Select(ol => Convert(ol, null))
                                                    .ToList()

offerList.ToList() извлекает данные из БД в память, а затем вы можете просто запустить на ней методы linq2object. На самом деле некоторые из предопределенных системных методов могут вызываться из linq2entity, а определенные пользователем методы не допускаются (потому что linq2sql не может создать дерево выражений).

2 голосов
/ 06 марта 2012

Ошибка возникает из-за отсутствия преобразования для метода Convert в Linq для сущностей.Вы должны сначала выполнить оценку данных, вызвав ToList () для данных Iqueryable.Затем преобразование может быть выполнено за пределами Linq в Entites в памяти.

return offerList == null ? new List<OfferDto>() : offerList.ToList().Select(ol => Convert(ol, null)).ToList();
2 голосов
/ 06 марта 2012

Linq To Entities пытается преобразовать ваш оператор Select в правильное выражение для вашей базы данных.Поскольку это не может знать о вашем методе Convert, этот перевод завершится неудачно, что приведет к появившейся ошибке.

Это можно устранить, разрешив Linq to Objects обрабатывать оператор Select.

offerList.ToList().Select(ol => Convert(ol, null));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...