2010-09-27 33 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

相關問題