2010-09-27 19 views
5

Các LINQ sau:Nested LINQ trả về một phương pháp này có thể không được dịch ra tiếng một ngoại lệ cửa hàng biểu

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

được đem lại cho tôi lỗi này:

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.

Dưới đây là hai dto lớp:

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

Sự cố là chọn phụ và danh sách JobDetails. Tôi đã thử thêm KnownType nhưng nó không hoạt động.

Tất cả đều hoạt động tốt trong LINQ Pad.

Bất kỳ ý tưởng nào?

Cheers

Steve

Trả lời

9

Đừng gọi ToList trên truy vấn bên trong (một cho JobDetails). Lỗi này là "Phương pháp này .ToList bạn nói về - nó không thể được dịch sang T-SQL!"

này nên làm việc:

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

Lưu ý rằng bạn có thể gọi ToList về sự kết thúc của truy vấn, như là một phần mà không cần phải được dịch sang T-SQL.

+0

Tôi nghĩ rằng bạn đang đi đúng hướng, nhưng điều đó mang lại cho tôi Không thể chuyển đổi hoàn toàn loại 'System.Linq.IQueryable ' thành System.Collections.Generic.List '. –

+1

Lỗi nào bạn nhận được (nếu có) nếu bạn thay đổi cuối .ToList() thành .AsEnumerable(). ToList()? –

+2

Vấn đề bây giờ là DTO của bạn không lập bản đồ tốt cho các truy vấn của bạn. Hãy để DTO của bạn chấp nhận một số điện thoại IE2umerhoặc thực hiện các truy vấn riêng biệt. –

Các vấn đề liên quan