如何在Linq做一个简单的计数?

时间:2010-12-02 09:27:49

标签: linq entity-framework ado.net linq-to-entities

我想做一个分页样式表,但是NeerDinner示例将整个数据提取到PaggingList类型,并且我有超过10 000行要提取,所以我跳过了那一部分。

所以我想出了这个查询

var r = (from p in db.Prizes
            join c in db.Calendars on p.calendar_id equals c.calendar_id
            join ch in db.Challenges on c.calendar_id equals ch.calendar_id
            join ca in db.ChallengeAnswers on ch.challenge_id equals ca.challenge_id
            join cr in db.ChallengeResponses on ca.challenge_answer_id equals cr.challenge_answer_id

            where
                p.prize_id.Equals(prizeId)
                && ch.day >= p.from_day && ch.day <= p.to_day
                && ca.correct.Equals(true)
                && ch.day.Equals(day)

            orderby cr.Subscribers.name

            select new PossibleWinner()
            {
                Name = cr.Subscribers.name,
                Email = cr.Subscribers.email,
                SubscriberId = cr.subscriber_id,
                ChallengeDay = ch.day,
                Question = ch.question,
                Answer = ca.answer
            })
        .Skip(size * page)
        .Take(size);

问题是,如何在Take部分之前获得结果总数

我在考虑:

var t = (from p in db.JK_Prizes
            join c in db.JK_Calendars on p.calendar_id equals c.calendar_id
            join ch in db.JK_Challenges on c.calendar_id equals ch.calendar_id
            join ca in db.JK_ChallengeAnswers on ch.challenge_id equals ca.challenge_id
            join cr in db.JK_ChallengeResponses on ca.challenge_answer_id equals cr.challenge_answer_id

            where
                p.prize_id.Equals(prizeId)
                && ch.day >= p.from_day && ch.day <= p.to_day
                && ca.correct.Equals(true)
                && ch.day.Equals(day)

            select cr.subscriber_id)
        .Count();

但是这将再次进行查询...

有人建议我如何有效地执行此操作

3 个答案:

答案 0 :(得分:13)

如果你这样查询:

var qry = (from x in y
           select x).Count();

... LINQ to SQL将足够聪明,使其成为SELECT COUNT查询,这可能相当有效(效率将更多地取决于查询中的条件)。底线是计数操作发生在数据库中,而不是LINQ代码中。

答案 1 :(得分:0)

写下我的旧评论:好吧,我在一段时间后面临同样的问题,然后我想出了LINQ to SP =)。创建一个SP并将其放入您的实体并使用它。您可以根据需要编写Sp,例如拉动总记录列。与现在使用wright相比,它更容易,更快速。

答案 2 :(得分:0)

您可以为查询逻辑设置计数,并参见下面的示例:

 public int GetTotalCountForAllEmployeesByReportsTo(int? reportsTo, string orderBy = default(string), int startRowIndex = default(int), int maximumRows = default(int))
        {
            //Validate Input
            if (reportsTo.IsEmpty())
                return GetTotalCountForAllEmployees(orderBy, startRowIndex, maximumRows);

            return _DatabaseContext.Employees.Count(employee => reportsTo == null ? employee.ReportsTo == null : employee.ReportsTo == reportsTo);
        }