我正在尝试为客户的订单日志创建html表。客户的定义为(我遗漏了很多东西):
public class Customer
{
public LazyList<Order> Orders { get; set; }
}
在获取客户时设置了LazyList:
public Customer GetCustomer(int custID)
{
Customer c = ...
c.Orders = new LazyList<Order>(_repository.GetOrders().ByOrderID(custID));
return c;
}
订单日志模型:
public class OrderLogTableModel
{
public OrderLogTableModel(LazyList<Order> orders)
{
Orders = orders;
Page = 0;
PageSize = 25;
}
public LazyList<Order> Orders { get; set; }
public int Page { get; set; }
public int PageSize { get; set; }
}
并且我传递客户。加载客户后下订单。现在我要制作的日志看起来像:
<table>
<tbody>
<%
int rowCount = ViewData.Model.Orders.Count();
int innerRows = rowCount - (ViewData.Model.Page * ViewData.Model.PageSize);
foreach (Order order in ViewData.Model.Orders.OrderByDescending(x => x.StartDateTime)
.Take(innerRows).OrderBy(x => x.StartDateTime)
.Take(ViewData.Model.PageSize))
{
%>
<tr>
<td>
<%= order.ID %>
</td>
</tr>
<%
}
%>
</tbody>
</table>
哪个工作正常。但是问题是评估ViewData.Model.Orders.Count()实际需要大约10分钟。
我尝试使用ViewData.Model.Orders.Count属性,结果是相同的-永远需要。
我还尝试直接从视图中调用_repository.GetOrders()。ByCustomerID(custID).Count(),并且可以在几毫秒内完美执行。
任何人都能看到使用LazyList进行简单计数的任何原因会花费这么长时间吗?似乎很想在获得简单计数时尝试遍历列表。
LazyList会在首次使用时加载所有数据,因此您正在Count调用中加载列表中的所有订单。从db获取所有数据,实例化对象等。当调用_repository.GetOrders()。ByCustomerID(custID).Count()时,它仅对数据库中的行进行计数并返回一个数字。
您遇到的问题是LazyList<T>正在填充数据库中的整个订单列表,以便您可以对它们进行计数。只是为了简单计数就需要做很多工作。
您可以将LazyList
public int Count
{
get
{
if(inner == null)
return query.Count;
else
return inner.Count;
}
}
如果订单清单尚未完成,它将向IQueryable询问计数。通过在IQueryable上调用.Count(),您要求LINQ to SQL仅获取结果数,这将转换为诸如“ SELECT COUNT(*)FROM Orders”之类的内容。这样做比混合所有结果然后对它们进行计数更有效,特别是如果您只对数字感兴趣的话!