2011-11-24 6 views
10

Bir tablodan diğerine, çok fazla sayıda başka bir tabloya eşleme yapan bir tabloya sahip bir tablo var. Aşağıdakileri yapmak isterim:Öğelere linq, nerede bir cümlede? (iç kısımda)

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

Bunu nasıl başarabilirim? İlk bölüm işe yarayacak, ancak 'iç WHERE' olmadan denerken, many_to_many_table'ın özelliklerine erişemiyorum, ama "içteki" derler kesinlikle derlenmeyecek. Temelde aşağıdaki SQL sorgusu gibi bir şey başarmak istiyorum:

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' 

Bu basit gibi görünen ama linq biri tek satırda bunu başarmak için bir yol bulamıyorum - birden fazla satır kullanarak istenen etki de döner ulaşmak için çok sonuç ve ben onların arasında döngü yapmak zorunda kalıyorum. Ben de böyle şeyler denedik:

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

Ama bütün kayıtlar arasında arama etmemesi nedeniyle etkisini nullifies bir FirstOrDefault() eklemek sürece bu noktada many_to_many_table bir özelliğini seçemezsiniz.

çalışma yaptı Ne

ama kodun birden fazla satır gerektirir ve arka planda linq-to-kuruluşlar çerçevesinde yaptırdığı SQL sorgusunda çok fazla sonuç verir:

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"); 
} 

Bu kod parçası, tüm dönecektir some_table içindeki satırlar, ilk Where koşuluna uygun ve ardından bir sonraki Where koşulunu uygular, açıkçası sadece many_to_many_table.RandomProperty öğesinin myValue değerine eşit olduğu tek bir satıra ihtiyaç duyarım.

cevap

16

Eğer iç WhereAny geçmek eğer çalışması gerekir: bir cazibe gibi

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

Çalışır. – L2Eer

+0

çok güzel. – qakmak

4

Katılmak isterseniz, neden bir katılımda bulunmuyorsunuz?

SQL ne yaptığını tam olarak ulaşması gereken
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 }; 

...

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