查询相关集合是否有任何条目,但没有导航属性

本文关键字:属性 导航 任何条 集合 是否 查询 | 更新日期: 2023-09-27 18:35:08

下面是外键关系中的表的简单表示例:

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

它将根据特定表达式返回至少包含一个相关Bar的所有Foos。但现在我处于一个特殊方案中,其中不存在导航属性Bars

我可以写一本看起来像这样的手册:

var query = context.Foos.Join(context.Bar
                    .Where(bar => bar.BarNumber == 42),
                    foo => foo.FooId,
                    bar => bar.FooId,
                    (foos, bars) => {
                        // What here?
                    });

我不确定这是否是一种正确的方法和/或如何处理结果选择器以获得等效的结果甚至 sql 查询。

查询相关集合是否有任何条目,但没有导航属性

只需反转查询,使条件在柱线上:

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