2010-09-27 11 views
5

Poniższy LINQ:Zagnieżdżony LINQ Zwracanie metoda ta nie może być tłumaczone na wyjątku sklep ekspresji

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(); 

daje mi ten błąd:

LINQ to Entities does not recognize the method 'System.Collections.Generic.List`1[KernWcfTest.DataTransferObjects.JobDetailDto] ToList[JobDetailDto](System.Collections.Generic.IEnumerable`1[KernWcfTest.DataTransferObjects.JobDetailDto])' method, and this method cannot be translated into a store expression.

Oto dwa dto klas:

[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; } 
} 

Problem stanowi lista podrzędna i lista JobDetails. Próbowałem dodać KnownType, ale to nie zadziałało.

Wszystko działa dobrze w LINQ Pad.

Wszelkie pomysły?

Cheers

Steve

Odpowiedz

9

Nie nazywaj ToList na zapytania wewnętrznej (jednego dla JobDetails). Błąd jest "Ta metoda .ToList, o której mówisz - nie można jej przetłumaczyć na T-SQL!"

To powinno działać:

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(); 

pamiętać, że można zadzwonić ToList na końcu zapytania, jako że część nie musi być tłumaczony na T-SQL.

+0

Myślę, że zmierzamy we właściwym kierunku, ale to daje mi nie można niejawnie przekonwertować typu „System.Linq.IQueryable ” do System.Collections.Generic.List ". –

+1

Jaki błąd pojawia się (jeśli występuje), jeśli zmienisz ostatnią metodę .ToList() na .AsEnumerable(). ToList()? –

+2

Problem polega na tym, że Twój DTO nie jest dobrze odwzorowany na twoje zapytania. Pozwól, aby Twój komputer DTO akceptował IEnumerable lub osobne zapytania. –

Powiązane problemy