实体框架,如何使用LinQ手动生成内部联接到实体

时间:2011-09-23 10:55:07

标签: entity-framework linq-to-entities inner-join

让我们假设我有一个名为Foo的表,其中包含主键FooID和整数非唯一列Bar。出于某种原因,在SQL查询中,我必须多次连接表Foo,如下所示:

SELECT * FROM Foo f1 INNER JOIN Foo f2 ON f2.Bar = f1.Bar INNER JOIN Foo f3 ON f3.Bar = f1.Bar...

我必须通过LINQ to Entities实现这一目标。

ObjectContext.Foos.Join(ObjectContext.Foos, a => a.Bar, b => b.Bar, (a, b) => new {a, b})

在结果查询中给了我LEFT OUTER JOIN,我需要内连接,这非常关键。

当然,如果在edmx中我根据需要添加尽可能多的Foo关联,然后在我的代码中使用它们,我可能会成功,Entity Framework将为每个关联替换正确的内连接。问题是在设计时我不知道需要多少连接。好的,一个解决方法是添加尽可能多的合理...

但是,如果没有别的,从理论的角度来看,是否可以通过EF创建内部联接而不明确定义关联?

在LINQ to SQL中,通过GroupJoin有一种(有点奇怪的)方法,比如:

ObjectContext.Foos.GroupJoin(ObjectContext.Foos, a => a.Bar, b => b.Bar, (a, b) => new {a, b}).SelectMany(o = > o.b.DefaultIfEmpty(), (o, b) => new {o.a, b)

我刚刚在EF中试过它,这个技巧在那里不起作用。它仍然为我生成外连接。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

在Linq to Entities中,下面是在同一个表的多个实例上进行内部联接的一种方法:

using (ObjectContext ctx = new ObjectContext())
{

    var result = from f1 in ctx.Foo
                 join f2 in ctx.Foo on f1.bar equals f2.bar
                 join f3 in ctx.Foo on f1.bar equals f3.bar
                 select ....;
}
相关问题