2010-08-26 69 views
1

我有一个相当复杂的连接查询,与我的数据库一起使用。运行后,我最终得到的结果包含一个baseID和一堆其他字段。那么我想借此baseid并且确定它在这样的桌子多少次出现:在Linq查询中计数

TableToBeCounted (One to Many) 
{ 
    baseID, 
    childID 
} 

如何执行仍然使用查询我已经有了,然后加入计数LINQ查询()与baseID?

像这样的事情在未经测试的LINQ代码:

from k in db.Kingdom 
join p in db.Phylum on k.KingdomID equals p.KingdomID 
where p.PhylumID == "Something" 
join c in db.Class on p.PhylumID equals c.PhylumID 
select new {c.ClassID, c.Name}; 

然后我想利用这些代码和计算多少订单,每个嵌套类中。然后我想使用LINQ to追加列,使我最终选择看起来是这样的:

select new {c.ClassID, c.Name, o.Count()}//Or something like that. 

整个例子是基于生物分类系统。

假定为我有多个表的例子:

Kingdom 
|--Phylum 
    |--Class 
     |--Order 

每个动物门具有一门ID和英国ID。这意味着所有的门是一个王国的一个子集。所有订单都是类ID的子集。我想要统计每个班级下面的订单数量。

+0

随时提供帮助您的答案,除了将最好的答案标记为“接受的答案”。它是StackOverflow声誉系统的一部分。人们通过投票获得代表奖励。 – 2010-08-26 15:05:44

回答

0
select new {c.ClassID, c.Name, (from o in orders where o.classId == c.ClassId select o).Count()} 

这可能吗?最好的,我可以做不知道更多的拱门。

+0

我得到'(from o in orders ...)'部分的错误:'错误无效的匿名类型成员声明。匿名类型成员必须用成员赋值,简单名称或成员访问来声明。' – Rick 2010-08-26 13:43:53

+0

我得到了正确的想法,但上面的代码不会编译(至少在我的情况下)它需要添加一个命名属性:'select new {c.ClassID,c.Name,** Count ** = from o where o.classId == c.ClassId select o).Count()}' – Rick 2010-08-26 14:12:22

0

如果关系你描述:

var foo = db.Class.Where(c=>c.Phylum.PhylumID == "something") 
        .Select(x=> new { ClassID = x.ClassID, 
             ClassName = x.Name, 
             NumOrders= x.Order.Count}) 
        .ToList(); 

方的问题:你为什么要加入这些实体?他们不应该自然地被FK'd,因此不需要明确的加入?

+0

我没有尝试你的代码,因为我得到了我的情况工作,但感谢FK的东西。遍历linq变得非常简单。我的数据表中有一点空白,但是多对多仍然需要连接;这很好。 – Rick 2010-08-26 14:11:08