2011-09-23 52 views
1

讓我們假設我有一個名爲Foo的表,主鍵爲FooID和一個整數非唯一列Bar。出於某種原因,在SQL查詢中我不得不多次,連接表美孚與本身是這樣的:實體框架,如何用LinQ手動生成內部連接到實體

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

我必須通過LINQ實現這一目標,以實體。

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

給我LEFT OUTER在結果查詢JOIN,我需要內部聯接,這是非常關鍵的。

當然,如果在edmx中,我可能成功地將Foo與它自己的許多關聯作爲必要添加,然後在我的代碼中使用它們,實體框架將爲每個關聯替換正確的內連接。問題是,在設計時我不知道我需要多少連接。好的,一種解決方法是儘可能多地添加合理的...

但是,如果沒有別的,從理論的角度來看,是否有可能通過EF創建內部連接而不明確定義關聯?

在LINQ to SQL有一個(有點怪異)的方式通過羣組加入做到這一點,是這樣的:

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

在LINQ到實體,下面是做一個內同一個表的多發情況下,加入一個方法:

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 ....; 
}