2012-04-13 28 views
5

Tôi có một LINQ to Entities truy vấn có dạng sau:Truy vấn lồng nhau không được hỗ trợ. Operation1 = 'UnionAll' Operation2 = 'MultiStreamNest'

var x = from a in SomeData 
    where ... some conditions ... 
    select new MyType 
    { 
     Property = a.Property, 
     ChildCollection = from b in a.Children 
         select new MyChildType 
         { 
          SomeProperty = b.Property, 
          AnotherProperty = b.AnotherProperty 
         } 
    }; 

var y = from a in SomeData 
    where ... some other conditions ... 
    select new MyType 
    { 
     Property = a.Property, 
     ChildCollection = from b in a.Children 
         select new MyChildType 
         { 
          SomeProperty = b.Property, 
          AnotherProperty = b.AnotherProperty 
         } 
    }; 

var results = x.Concat(y); 

(Đây là một ví dụ đơn giản - những 'nơi' và 'chọn' điều khoản phức tạp hơn được hiển thị ở đây. Tôi đang sử dụng các câu lệnh truy vấn riêng biệt như tạo một kết hợp đơn lẻ quá phức tạp, có quá nhiều điều kiện và cần có tuổi để biên dịch)

Biên dịch tốt, nhưng không thực hiện được ngoại lệ:

"The nested query is not supported. Operation1='UnionAll' Operation2='MultiStreamNest' 

Lưu ý, tôi đang cố gắng chiếu vào một cấu trúc được sắp xếp lồng nhau. Nếu tôi gọi .ToList() trên x và y trước khi Concat() nó hoạt động tốt. Như một điểm nữa, một trong những thuộc tính của tôi là một enum, nhưng tôi gán cho nó bằng cách sử dụng một thuộc tính wrapper số nguyên.

Có cách nào tôi có thể làm những gì tôi muốn làm mà không phải kéo tất cả dữ liệu vào bộ nhớ? Hay là enum gây ra sự thất bại?

Cảm ơn,

T

Trả lời

0

Bạn đã thử với

var results = x.Union(y); 

?

Tiz

hoặc

var x = (from a in SomeData 
where ... some conditions ... 
select new MyType 
{ 
    Property = a.Property, 
    ChildCollection = (from b in a.Children 
        select new MyChildType 
        { 
         SomeProperty = b.Property, 
         AnotherProperty = b.AnotherProperty 
        }).ToArray() //or DefaultIfEmpty 
}).Concat(
from a in SomeData 
where ... some other conditions ... 
select new MyType 
{ 
    Property = a.Property, 
    ChildCollection = (from b in a.Children 
        select new MyChildType 
        { 
         SomeProperty = b.Property, 
         AnotherProperty = b.AnotherProperty 
        }).ToArray() //or DefaultIfEmpty 
}); 
+0

Chỉ cần thử thứ hai trong số này và có vẻ hành xử giống hệt như trước, nghĩa là không hoạt động như tôi mong đợi (xem nhận xét của tôi về bài đăng của @ Arion –

+0

... hiện đã bị xóa. t tâm sử dụng Union là tập hợp kết quả nên được phân biệt, nhưng sau đó tôi nhận được ngoại lệ "The 'Distinct' hoạt động không thể được áp dụng cho bộ sưu tập ResultType của đối số đã chỉ định" mà tôi tin là vì Distinct không thể xử lý lồng nhau –

+0

Nếu trống? Làm thế nào là nó hành vi? – innovia

0

tôi đã có vấn đề tương tự khi cố gắng tiếp nhau hoặc công đoàn bộ đa tài sản chuyển hướng vào đơn IEnumerable, đây là mẫu mã:

var requiredDocuments =     
       (from x in db.RequestTypes where (some condition) select x.RequiredDocuments) 
       .SelectMany(r => r).ToList<DataModel.RequiredDocument>() 
       .Concat(
       (from c in db.Categories where (some condition) select c.RequiredDocuments) 
       .SelectMany(r => r).ToList<DataModel.RequiredDocument>() 
       ) 
       .Concat(
       (from f in db.Fields where (some condition) select f.RequiredDocuments) 
       .SelectMany(r => r).ToList<DataModel.RequiredDocument>() 
       ); 
+0

Đây có phải là vấn đề về mã của bạn hoặc mã hoạt động không? – Jerther

+0

vì điều này gọi ToList trước khi thực hiện các Concat này nên làm việc. – Florian

0

Nếu tôi hiểu chính xác những gì bạn đang cố gắng làm, tôi đã chạy vào cùng một vấn đề nhiều lần. Điểm mấu chốt là, thực hiện các công đoàn với các phép chiếu lồng nhau không được hỗ trợ và nếu bạn cần làm điều đó, bạn sẽ phải thực hiện các kết quả với ToList trước tiên.

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