嵌套LINQ返回此方法无法转换为存储表达式异常

Ste*_*rne 5 c# linq-to-entities

以下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();
Run Code Online (Sandbox Code Playgroud)

给我这个错误:

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; }
}
Run Code Online (Sandbox Code Playgroud)

问题是sub-select和JobDetails列表.我尝试添加KnownType但它没有用.

这一切都在LINQ Pad中正常工作.

有任何想法吗?

干杯

史蒂夫

Jud*_*ngo 9

不要在内部查询(JobDetails的那个)上调用ToList.错误是"你说的.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();
Run Code Online (Sandbox Code Playgroud)

请注意,您可以在查询结束时调用ToList,因为该部分不需要转换为T-SQL.

  • 更改了DTO以接受IEmumerable <T>,现在一切正常.谢谢犹大. (4认同)
  • 现在的问题是您的DTO无法很好地映射到您的查询.让你的DTO接受IEnumerable <T>,或者做单独的查询. (2认同)