使用Linq加载和过滤大量数据

时间:2016-06-02 23:51:59

标签: asp.net-mvc linq entity-framework-6

我正在研究一个项目,我被告知可能会有来自每个地区的大量数据。我担心一旦我们上线,应用程序可能会很慢。结果,我要求QA团队进行负载测试。经理说不,因为他们没有工具和/或资源来做这件事。我想得到一些反馈,我可以做些什么来优化代码。

我正在考虑将if语句移动到它自己的方法中,因此可以通过switch区域调用它。然后,在if语句中,我将执行LINQ to方法语法传递表达式。而不是regionOrder.Where,它将是db.orders.where(根据搜索偏好传递名称,位置和日期。

List<order> result = null;
List<order> regionOrder = null;

switch (region)
{
    case "NorthEast":
        regionOrder = db.orders.Where(x => x.Name == region).ToList();
        break;
    case "SouthEast":
        regionOrder = db.orders.Where(x => x.Name == region).ToList();
        break;
}

if (order.Name.IsNotNull() && order.Location.IsNotNull() && order.DateOrdered != null)
{
    result = regionorder.Where(x => x.Name == order.Name && x.Location == order.Location && x.DateOrdered == order.DateOrdered);
}
else if (order.Name.IsNotNull() && order.Location.IsNotNull())
{
    result = regionOrder.Where(x => x.Name == order.Name && x.Location == order.Location);
} else if (order.Name.IsNotNull() && order.DateOrdered != null)
{
    result = regionOrder.Where(x => x.Name == order.Name && x.DateOrdered == order.DateOrdered);
} else if ( order.Location.IsNotNull() && order.DateOrdered != null)
{
    result = regionOrder.Where(x => x.Location == order.Location && x.DateOrdered == order.DateOrdered);
} else if (order.Name.IsNotNull())
{
    result = regionOrder.Where(x => x.Name == order.Name);
}
else if (order.Location.IsNotNull())
{
    result = regionOrder.Where(x => x.Location == order.Location);
}
else if (order.DateOrdered != null)
{
    result = regionOrder.Where(x => x.DateOrdered == order.DateOrdered);
}

1 个答案:

答案 0 :(得分:4)

您对.ToList()的使用意味着它将数据库中的所有记录读入内存集。并且不需要所有if/else块 - 您只需要3 if个语句,而您的代码可以只是

IQueryable<order> regionOrder = db.orders.Where(x => x.Name == region)
if (order.Name.IsNotNull())
{
    regionOrder = regionOrder.Where(x => x.Name == order.Name);
}
if (order.Location.IsNotNull())
{
    regionOrder = regionOrder.Where(x => x.Location == order.Location);
}
if (order.DateOrdered != null)
{
    regionOrder = regionOrder.Where(x => x.DateOrdered == order.DateOrdered);
}

将转换为正确的SQL查询并仅返回您需要的结果。然后,如果你想创建一个立即执行的内存集

List<order> result = regionOrder.ToList();