我正在尝试为客户创建订单日志的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获取简单计数需要这么长时间的原因吗?在得到一个简单的计数时,它似乎试图遍历列表。
答案 0 :(得分:3)
LazyList在首次使用时加载所有数据,因此您将在Count调用中加载列表中的所有订单。从db获取所有数据,实例化对象等。当您调用_repository.GetOrders()。ByCustomerID(custID).Count()时,它只计算数据库中的行并返回一个数字。
答案 1 :(得分:1)
您遇到的问题是LazyList<T>正在填充数据库中的整个订单列表,这样您就可以对它们进行计数。这只是为了简单计算而做的很多工作。
您可以修改LazyList&lt; T&gt;上的Count方法。分为以下几类:
public int Count
{
get
{
if(inner == null)
return query.Count;
else
return inner.Count;
}
}
如果订单清单尚未保湿,则会向IQueryable询问计数。通过在IQueryable上调用.Count(),您要求LINQ to SQL只获取结果数,这将转换为“SELECT COUNT(*)FROM Orders”。这样做比强化所有结果然后计算它们 更有效率,特别是如果你只对这个数字感兴趣的话!