Вложенный LINQ, возвращающий этот метод, не может быть преобразован в исключение выражения хранилища - PullRequest
5 голосов
/ 27 сентября 2010

Следующий LINQ:

retval = ( from jm in entities.JobMasters
                 where jm.UserId == userId && jm.IsRemote == false
                 select new JobDto
                 {
                     JobMasterId = jm.JobMasterId,
                     ExternalTaskId = jm.ExternalTaskId,
                     JobDetails = ( from jd in entities.JobDetails
                                    where jd.JobMasterId == jm.JobMasterId
                                    select new JobDetailDto { ScreenFieldId = jd.ScreenFieldId, FieldValue = jd.FieldValue }
                     ).ToList()
                 }
            ).ToList();

дает мне эту ошибку:

LINQ to Entities не распознает метод «System.Collections.Generic.List`1 [KernWcfTest.DataTransferObjects.JobDetailDto] Метод ToList [JobDetailDto] (System.Collections.Generic.IEnumerable`1 [KernWcfTest.DataTransferObjects.JobDetailDto]) ', и этот метод не может быть переведен в выражение магазина.

Вот два класса dto:

[DataContract]
public class JobDetailDto
{
    [DataMember]
    public int ScreenFieldId { get; set; }

    [DataMember]
    public string FieldValue { get; set; }
}

[DataContract]
[KnownType(typeof(JobDetailDto))]
public class JobDto
{
    [DataMember]
    public int JobMasterId { get; set; }

    [DataMember]
    public string ExternalTaskId { get; set; }

    [DataMember]
    public List<JobDetailDto> JobDetails { get; set; }
}

Проблема заключается в дополнительном выборе и списке JobDetails. Я попытался добавить KnownType, но это не сработало.

Все это прекрасно работает в LINQ Pad.

Есть идеи?

Приветствия

Steve

1 Ответ

9 голосов
/ 27 сентября 2010

Не вызывайте ToList для внутреннего запроса (тот, что для JobDetails).Ошибка: «Это метод .ToList, о котором вы говорите - он не может быть переведен в T-SQL!»

Это должно работать:

retval = ( from jm in entities.JobMasters
             where jm.UserId == userId && jm.IsRemote == false
             select new JobDto
             {
                 JobMasterId = jm.JobMasterId,
                 ExternalTaskId = jm.ExternalTaskId,
                 JobDetails =   from jd in entities.JobDetails
                                where jd.JobMasterId == jm.JobMasterId
                                select new JobDetailDto { ScreenFieldId = jd.ScreenFieldId, FieldValue = jd.FieldValue }
                 )
             }
        ).ToList();

Обратите внимание, что вы можете вызвать ToListв конце запроса, поскольку эту часть не нужно переводить в T-SQL.

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