2011-11-24 56 views
10

我有一个表与一对多映射到一个表,有多对多映射到另一个表。我想要做以下事情:linq to entities,where where where clause? (内部在哪里)

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

我该如何做到这一点?第一部分可以工作,但是在没有'内部WHERE'的情况下尝试时,我无法访问many_to_many_table的属性,但“内部的地方”显然不能编译。我基本上要达到类似下面的SQL查询:

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' 

这看似简单,但我不能找到一种方法来实现它在LINQ的一个单行 - 使用多行来达到预期的效果返回太很多结果,我最终不得不通过它们循环。我也尝试这样的东西:

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

但在这一点上,除非我添加FirstOrDefault(),其勾销,因为它不会在所有的搜索记录的效果我不能选择的many_to_many_table属性。

什么做的工作,但需要多行代码,并在后台通过LINQ到实体框架构建的SQL查询返回的结果太多:

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

这段代码将返回所有some_table中的行匹配第一个Where条件,然后应用下一个Where条件,而显然只需要一行,其中many_to_many_table.RandomProperty等于myValue。

回答

16

如果你改变了内WhereAny它应该工作:

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

就像一个魅力。 – L2Eer

+0

很漂亮。 – qakmak

4

如果你想做一个连接,你为什么不只是做一个连接?

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

这应该实现你的SQL不正是......

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