C#和Linq to Entities在lambda语句中使用count

时间:2018-01-16 00:22:52

标签: c# linq

我有以下内容返回所有有孩子的记录。

var allStops = (from s in db.stop_details
                where db.billing_transactions.Any(c=>c.stop_details_id == s.id)
                orderby s.id
                select s).ToArray();

我想知道所有包含3个孩子的记录,例如:

var allStops = (from s in db.stop_details
                where db.billing_transactions.Any(c=>c.stop_details_id == s.id).Count() == 3
                orderby s.id
                select s).ToArray();

var allStops = (from s in db.stop_details
                where db.billing_transactions.Count(c=>c.stop_details_id == s.id) == 3
                orderby s.id
                select s).ToArray();

我似乎无法使语法正确...

3 个答案:

答案 0 :(得分:1)

由于您说两个表之间存在数据库关系,并假设billing_transactions.stop_details_id是外键,因此您应该可以执行此类操作。

var allStops = (from s in db.stop_details
                where s.billing_transactions.Count() == 3
                orderby s.id
                select s).ToArray();

答案 1 :(得分:1)

如果您使用EF,则应使用导航属性。根据我的看法,stop_detailsbilling_transactions之间应该有一对多的关系,因此stop_details实体应该有一个集合导航属性(让我们称之为billing_transactions) 。您的查询可能如下:

var allstops=db.stop_details.Where(s=>s.billing_transactions.Count()==3)
                            .OrderBy(s=>s.id)
                            .ToArray();

现在,如果您不想使用导航属性,我建议您进行group join

var allStops = (from s in db.stop_details
                join bt in db.billing_transactions on bt.stop_details_id equals s.id into bts
                where bts.Count()==3
                orderby s.id
                select s).ToArray();

答案 2 :(得分:-1)

使用点表示法,请尝试以下示例,假设您有一个从billing_transaction到stop_details。

var allstops = db.stop_details
    .Where (s=>s.billing_transactionsc.stop_details_id.Count() == 3)
    .OrderBy (s => s.id)
    .ToArray();