2011-11-24 6 views
10

Tôi có một bảng với một ánh xạ từ một đến nhiều bảng có nhiều ánh xạ tới một bảng khác. Tôi muốn thực hiện những điều sau:linq cho các thực thể, một mệnh đề where in where? (bên trong)

var results = context.main_link_table 
        .Where(l => l.some_table.RandomProperty == "myValue" && 
          l.some_table.many_to_many_table 
          .Where(m => m.RandomProperty == "myValue")); 

Làm cách nào để có thể đạt được điều này? Phần đầu tiên sẽ làm việc nhưng khi thử nó mà không có 'bên trong WHERE', tôi không thể truy cập thuộc tính của many_to_many_table, nhưng "bên trong" rõ ràng sẽ không biên dịch. Về cơ bản tôi muốn đạt được một cái gì đó giống như truy vấn SQL sau:

SELECT * from main_link_table 
INNER JOIN some_table AS t1 ON t1.association = main_link_table.association 
INNER JOIN many_to_many_table AS t2 ON t2.association = some_table.association 
WHERE t1.RandomProperty = 'MyValue' AND t2.RandomProperty = 'MyValue' 

Đó là dường như đơn giản nhưng tôi không thể tìm thấy một cách để đạt được điều đó trong một dòng duy nhất của LINQ - sử dụng nhiều dòng để đạt được hiệu quả mong muốn trả quá nhiều kết quả và cuối cùng tôi phải lặp lại chúng. Tôi cũng đã cố gắng những thứ như:

var results = main_link_tbl.Include("some_table.many_to_many_table") 
          .Where(l => l.some_table.many_to_many_table.<property> 
             == "MyValue") 

Nhưng vào thời điểm này tôi không thể chọn một tài sản của many_to_many_table trừ khi tôi thêm một FirstOrDefault(), sẽ xóa tác dụng vì nó sẽ không tìm kiếm thông qua tất cả các hồ sơ.

việc gì đã làm, nhưng đòi hỏi nhiều dòng mã và ở chế độ nền trả quá nhiều kết quả trong truy vấn SQL được xây dựng bởi các LINQ-to-entity framework:

var results = db.main_link_table.Include("some_table") 
           .Include("some_table.many_to_many_table") 
           .Where(s => s.some_table.RandomProperty 
              == "myValue") 
           .Select(s => s.some_table); 

foreach(var result in results) { 
    var match_data = result.Where(s => s.many_to_many_table.RandomProperty 
             == "myValue"); 
} 

Đoạn mã này sẽ trả lại tất cả các hàng bên trong some_table khớp với điều kiện Where first và sau đó áp dụng điều kiện Where tiếp theo, trong khi tôi rõ ràng chỉ cần một hàng duy nhất nơi many_to_many_table.RandomProperty bằng myValue.

Trả lời

16

Nó sẽ làm việc nếu bạn thay đổi nội Where-Any:

var results = context.main_link_table 
        .Where(l => l.some_table.RandomProperty == "myValue" && 
           l.some_table.many_to_many_table 
            .Any(m => m.RandomProperty == "myValue")); 
+0

trình như một say mê. – L2Eer

+0

rất đẹp. – qakmak

4

Nếu bạn muốn tham gia, tại sao bạn không tham gia?

var query = from main in context.MainLinks 
      join t1 in context.Some on main.Association equals t1.Association 
      where t1.RandomProperty == "MyValue" 
      join t2 in context.ManyToMany on t1.Association equals t2.Association 
      where t2.RandomProperty == "MyValue" 
      select new { main, t1, t2 }; 

Điều đó sẽ đạt được chính xác những gì SQL của bạn không ...

1
from link in db.main_link_table 
join s in db.some_table on link.association1 = s.association 
join m in db.many_to_many_table on link.association2 = m.association 
where s.X = 'MyValue' AND m.Y = 'MyValue' 
select m; // or s or link or both 3 as you want