2010-09-27 10 views
5

La siguiente LINQ:anidada LINQ La devolución de un este método no puede ser traducido a una excepción de tienda de expresión

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

me está dando este error:

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.

Éstos son los dos dto clases:

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

El problema es la sub-selección y la lista de JobDetails. Intenté agregar KnownType pero no funcionó.

Todo esto funciona bien en LINQ Pad.

¿Alguna idea?

Saludos

Steve

Respuesta

9

no llame a ToList en la consulta interna (el uno para JobDetails). El error es "Este método .ToList del que hablas, ¡no se puede traducir a T-SQL!"

Esto debería funcionar:

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

Tenga en cuenta que se puede llamar ToList en el final de la consulta, ya que esa parte no necesita ser traducido a T-SQL.

+0

Creo que va en la dirección correcta, pero eso me da No se puede convertir implícitamente el tipo 'System.Linq.IQueryable ' en System.Collections.Generic.List '. –

+1

¿Qué error obtienes (si lo hay) si cambias el último .ToList() a .AsEnumerable(). ToList()? –

+2

El problema ahora es que su DTO no se adapta bien a sus consultas. Deje que su DTO acepte un IEnumerable , o haga consultas separadas. –

Cuestiones relacionadas