以下是外键关系中表的简单表示例:
Foo Bar
------- -------
FooId BarId
FooName FooId (FK)
BarNumber
假设实体在Linq to Entities上下文中导入,并创建了导航属性Bars
。我现在可以执行这样的查询:
var query = context.Foos.Where(foo => foo.Bars.Any(bar => bar.BarNumber == 42));
它将根据特定表达式返回包含至少一个相关Foos
的所有Bar
。但现在我处于一个特殊情况,其中不存在导航属性Bars
。< / p>
我可以写一本看起来像这样的手册:
var query = context.Foos.Join(context.Bar
.Where(bar => bar.BarNumber == 42),
foo => foo.FooId,
bar => bar.FooId,
(foos, bars) => {
// What here?
});
我不确定这是否是正确的方法和/或如何处理结果选择器以获得等效结果甚至是sql查询。
答案 0 :(得分:0)
简单地反转查询,以便条件在Bars:
var bars = context.Bars.Where(bar => bar.BarNumber == 42);
var query = bars.Join(context.Foos,
bar => bar.FooId,
foo => foo.FooId,
(bar, foo) => foo).Distinct();
编辑 - 如果您发现此代码更清晰,您可以使用GroupJoin:
var query = foos.GroupJoin(context.Bars,
foo => foo.FooId,
bar => bar,
(foo, bars) => { Foo: foo, Bars: bars })
.Where(x.Bars.Any(b => b.BarNumber == 42));