Asp.Net MVC-Rob Conery的LazyList-Count()或Count

问题描述 投票:2回答:2

我正在尝试为客户的订单日志创建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进行简单计数的任何原因会花费这么长时间吗?似乎很想在获得简单计数时尝试遍历列表。

c# asp.net asp.net-mvc linq-to-sql lazy-loading
2个回答
3
投票

LazyList会在首次使用时加载所有数据,因此您正在Count调用中加载列表中的所有订单。从db获取所有数据,实例化对象等。当调用_repository.GetOrders()。ByCustomerID(custID).Count()时,它仅对数据库中的行进行计数并返回一个数字。


1
投票

您遇到的问题是LazyList<T>正在填充数据库中的整个订单列表,以便您可以对它们进行计数。只是为了简单计数就需要做很多工作。

您可以将LazyList 类的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”之类的内容。这样做比混合所有结果然后对它们进行计数更有效,特别是如果您只对数字感兴趣的话!

© www.soinside.com 2019 - 2024. All rights reserved.