2010-09-27 9 views
5

aşağıdaki LINQ tercüme edilemez: geri dönenİçiçe LINQ bu yöntem bir mağaza ifade istisnasız

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

bana bu hatayı veriyor: İşte

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.

sınıflar dto iki:

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

Sorun, alt seçim ve JobDetails listesidir. KnownType eklemeyi denedim ama işe yaramadı.

Tüm bunlar LINQ Pad'de düzgün çalışıyor.

Herhangi bir fikrin var mı?

Alkış

Steve

cevap

9

iç sorgunun (JobDetails için bir adet) üzerinde ToList deme. Hata, "Bu, konuştuğunuz .ToList yöntemi - T-SQL'e çevrilemez!"

Bu çalışması gerekir: o kısmı T-SQL çevrilmesine gerek yoktur gibi, sorgunun ucunda ToList çağırabilir

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

Not.

+0

Sana doğru yönde gidiyoruz düşünüyorum, ama bu dolaylı türünü dönüştürülemez bana verir 'System.Linq.IQueryable ' System.Collections.Generic.List için '. –

+1

Sonuncu .ToList() 'i .AsEnumerable() olarak değiştirirseniz, hangi hatayı alırsınız(). ToList()? –

+2

Sorun şu ki, DTO'nuz sorgularınıza iyi harita vermiyor. DTO'nuzun bir IEnumerable kabul etmesine izin verin veya sorguları ayrı yapın. –