2010-09-27 32 views
5

以下LINQ:嵌套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 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.

这里有两个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,但没有奏效。

这一切都在LINQ垫正常工作。

任何想法?

干杯

史蒂夫

回答

9

不要调用ToList在内部查询(一个为JobDetails)。错误是“你提到的这个.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。

+0

我认为你是正确的方向,但是这给了我不能隐式转换类型'System.Linq.IQueryable '到System.Collections.Generic.List ”。 – 2010-09-27 03:18:04

+1

如果将最后一个.ToList()更改为.AsEnumerable()。ToList(),会出现什么错误(如果有)? – 2010-09-27 03:21:30

+2

现在的问题是您的DTO无法很好地映射到您的查询。让你的DTO接受一个I​​Enumerable ,或做单独的查询。 – 2010-09-27 03:43:24

相关问题