让我们假设我有一个名为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中试过它,这个技巧在那里不起作用。它仍然为我生成外连接。
有什么想法吗?
答案 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 ....;
}