我有一个表,其中一对多映射到一个表,该表具有多个到另一个表的映射。我想做以下事情:
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")
但是此时我无法选择many_to_many_table的属性,除非我添加FirstOrDefault(),这会使效果无效,因为它不会搜索所有记录。
什么工作,但需要多行代码,并在后台返回由linq-to-entities框架构建的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。
答案 0 :(得分:19)
如果您将内部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"));
答案 1 :(得分:5)
如果你想加入,你为什么不加入?
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所做的......
答案 2 :(得分: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