bal*_*dre 5 linq ado.net linq-to-entities entity-framework
我想做一个分页样式表,但是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);
Run Code Online (Sandbox Code Playgroud)
问题是,如何在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();
Run Code Online (Sandbox Code Playgroud)
但那将再次进行查询......
有人建议我怎样才能有效地做到这一点?
Fre*_*örk 15
如果你这样做一个查询:
var qry = (from x in y
select x).Count();
Run Code Online (Sandbox Code Playgroud)
... LINQ to SQL将足够聪明,使这成为一个SELECT COUNT查询,这可能相当有效(效率将更多地取决于查询中的条件).底线是计数操作发生在数据库中,而不是LINQ代码中.