2010-10-11 140 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