2010-10-11 503 views
3

比方說,我有3張桌子:購物車,籃子和雞蛋,其中一個籃子可以包含許多雞蛋,而購物車包含很多籃子。每個籃子都有一個映射到購物車的外鍵,每個蛋都有一個映射到籃子的外鍵。linq合併2個查詢

我需要返回一個包含以下3列的表:

購物車名|購物車中籃子的數量|車中的雞蛋數量。

每張表都是一個EF,我正在使用linq和VB。

到目前爲止,我有2個查詢:一個返回列的購物車名稱和計數籃,另一個返回購物車名稱和計數的雞蛋。 如何組合這兩個結果表,以便在一個表中獲得結果?

  Dim query1 = (From cart In myEntities.Carts 
      Where cart.UserID = TheUserID 
      Join baskets In myEntities.Baskets On baskets.CartID Equals cart.CartID 
      Select cart.CartName, cart.baskets.Count()).Distinct() 

      Dim query2 = (From cart In myEntities.Carts 
      Where cart.UserID = TheUserID 
      Join baskets In myEntities.Baskets On baskets.CartID Equals cart.CartID 
      Select cart.CartName, baskets.Eggs.Count()).Distinct() 

感謝您的幫助。

回答

2

下面的查詢給出了預期的結果:

from cart in Carts _ 
select cart.CartName, BasketsInCart = cart.Baskets.Count(), EggsInCart = cart.Baskets.SelectMany(Function(basket)basket.Eggs).Count() 

因爲cart.Baskets是Ienumerable(of Baskets),該SelectMany運算符可以用來從所有的籃子得到所有的雞蛋。

+0

我修改了查詢以使您的方法具有EggCount,cartname和EggCount:我應該有3列,第一個和第三個給出相同的結果。然而,第一列給我的每個購物車的蛋數,第二列包含相同的購物車三次,然後是兩個空的cartnames,第三列顯示5個計數,前3個計數顯示我不能根據原始數據和2個零重現。有5輛車,其中3個有雞蛋,2個沒有。 ahhhhh,這是在高峯期的髮卡! – user471807 2010-10-11 18:34:59

+0

我真的不明白第一列和第三列有什麼區別,爲什麼你需要這個設置?你最後想要做什麼? – jaraics 2010-10-12 07:21:11

0

如果您已定義關係,則可以在嵌套實體上使用Count方法。

var cartCounts = from c in myEntities.Carts 
       select new 
       { 
        c.CartName, 
        BasketCount = c.Baskets.Count(), 
        EggCount = c.Baskets.Eggs.Count() 
       }; 
+0

它基本上告訴我,雞蛋不是會員。你能明白爲什麼嗎? – user471807 2010-10-11 05:49:24

+0

您在籃子和雞蛋之間建立了關係嗎?你的兩個查詢是否都可以工作? – 2010-10-11 05:53:52

+0

是的,兩個查詢都有效。 – user471807 2010-10-11 05:58:04