代码之家  ›  专栏  ›  技术社区  ›  Steve Chadbourne

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

  •  5
  • Steve Chadbourne  · 技术社区  · 14 年前

    以下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不识别该方法 '系统.集合.通用。列表`1[KernWcfTest.DataTransferObjects.JobDetailDto] ToList[作业详细信息到](系统.集合.通用.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,但没有成功。

    在linqpad中这一切都很好。

    有什么想法吗?

    干杯

    史蒂夫

    1 回复  |  直到 13 年前
        1
  •  9
  •   Judah Gabriel Himango    14 年前

    不要在内部查询(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();
    

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