我试图通过以下方法使用EntityFramework和Linq获得总记录数。返回计数很慢。
public static int totalTracking(int id)
{
using (var ctx = new GPEntities())
{
var tr = ctx.Tracking
.Where(c => c.clientID == Config.ClientID)
.Where(c => c.custID == id)
.Where(c => c.oOrderNum.HasValue)
.ToList();
return tr.Count();
}
}
答案 0 :(得分:10)
您可以显着简化查询:
using (var ctx = new GPEntities())
{
return ctx.Tracking
.Where(c => c.clientID == Config.ClientID)
.Where(c => c.custID == id)
.Where(c => c.oOrderNum.HasValue)
.Count();
}
当您调用ToList
时,这将触发实现,因此将向数据库发出查询,并将检索所有列。实际计数将在客户端进行。
如果您只是Count
,而没有ToList
,则会在您拨打Count
时发出查询,而服务器只返回一个号码,而不是表格。
这对性能并不重要,但我认为如果没有那么多Where
,代码看起来会有点好看:
using (var ctx = new GPEntities())
{
return ctx.Tracking
.Where(c =>
c.clientID == Config.ClientID &&
c.custID == id &&
c.oOrderNum.HasValue)
.Count();
}
甚至
using (var ctx = new GPEntities())
{
return ctx.Tracking
.Count(c =>
c.clientID == Config.ClientID &&
c.custID == id &&
c.oOrderNum.HasValue);
}
答案 1 :(得分:3)
您可以非常简化,只需使用Count Extension method
即可你试过了吗?
public static int totalTracking(int id)
{
using (var ctx = new GPEntities())
{
return ctx.Tracking.Count(
c => c.clientID == Config.ClientID &&
c.custID == id &&
c.oOrderNum.HasValue);
}
}
答案 2 :(得分:2)
移除电话.ToList()
。它强制查询将整个结果拉到客户端。
通过删除它,并直接在tr的结果上调用.Count()(没有ToList()
),Count()
成为查询本身的一部分,并远程执行,这将大大简化这样:
public static int totalTracking(int id)
{
using (var ctx = new GPEntities())
{
var tr = ctx.Tracking
.Where(c => c.clientID == Config.ClientID)
.Where(c => c.custID == id)
.Where(c => c.oOrderNum.HasValue);
// This can be added above, or left here - the end result is the same
return tr.Count();
}
}