2009-08-13 59 views
5

我有兩個表彼此有關係如何在實體框架(多個地方或聯合)中執行此操作?

表A與表B有一對多的關係,所以這會在每個表中創建一個導航屬性。

現在我需要檢查表A(用戶名)的值,我需要檢查表B(ClubId)的值。

所以,在我的腦海它會是這樣的

Join the tables together 
Where A.userName == "bob" && 
where B.clubId == "Car" 

// return the count. 

但現在我知道有實體的東西,應該使加入較少見,所以我想知道如果我可以用加入再去做。

我想這

int count = Entity.TableA.where(a => a.userName == "bob" && a.TableB.where(i => i.ClubId == "Car")).Count(); 

所以這也不行,因爲它不會返回正確的類型(第2位置)。這就是我的想法,我期望如何完成工作。

那麼它應該如何看待?

P.S

我寧願一個例子中的LINQ查詢方法做像我上面那樣。

回答

4

過濾TableA你加入之前可能是更有效的:

var clubs = from a in Entity.TableA 
      where a.userName == "bob" 
      from b in a.TableB 
      where b.clubId == "Car" 
      select b; 

var count = clubs.Count(); 

您不必使用兩個變量,這只是我的偏好這裏的清晰度。

還是在方法的語法可以簡化一下:

var count = Entity.TableA.Where(a => a.userName == "bob") 
         .SelectMany(a => a.TableB) 
         .Count(b => b.clubId == "Car"); 

不過,我不能確定EF理解這些特定的表達。如果沒有,編譯器會像這樣翻譯上面的查詢:

var count = Entity.TableA.Where(a => a.userName == "bob") 
         .SelectMany(a => a.TableB, (a,b) => new { a, b }) 
         .Where(x => x.b.clubId == "Car") 
         .Count(); 
+0

啊。 哇。我不確定我的情況更好。 selectMany讓我失望。那麼如果我需要另一個過濾器會怎麼樣?我會添加另一個selectMany嗎? 那麼第一種方法的語法的作品我不知道它是否內部下降,並做第二件事。所有的查詢將採用相同的執行時間。 什麼是第二個SelectMany的。像什麼是a => a.TableB,(a,b)=>)呢? – chobo2 2009-08-13 17:53:22

+0

我已經在查詢翻譯中修復了該帖子。 第一個SelectMany本質上「扁平化」了你的嵌套集合,從所有A中返回所有B的序列。第二個SelectMany接受兩個委託,一個「collectionSelector」從A和一個「resultSelector」中檢索B的集合,以指定給定A和B的返回值。LINQ只是選擇兩個輸入對象,用於查詢的其餘部分。 – dahlbyk 2009-08-13 18:05:04

5

假設你的EF模型具有用戶和俱樂部之間的關係可能會做這樣的事情:如果你想同時返回用戶和俱樂部的元素看看在查詢中加入

var usersNamedBobInCarClub = 
      from A in User 
      from B in A.Clubs 
      where A.userName == "bob" && 
        B.clubId == "Car" 
      select A; 

+0

我會試試,但我該如何在Linq方法查詢中做到這一點? – chobo2 2009-08-13 03:14:27