【问题标题】:Loading and Filtering Huge Amount of Data using Linq使用 Linq 加载和过滤大量数据
【发布时间】:2016-06-02 23:51:58
【问题描述】:

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

我正在考虑将 if 语句移动到它自己的方法中,以便可以从传递区域的 switch case 调用它。然后,在 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);
}

【问题讨论】:

  • 从您的查询中删除 .ToList(),以便数据不会具体化到内存中(但两个 case: 语句是相同的,因此不清楚您要如何处理)
  • 你只需要 3 个 if 语句 - if (order.Name.IsNotNull()) { result = regionOrder.Where(x =&gt; x.Name == order.Name); }; if (order.Location.IsNotNull()) { .... }; if (order.DateOrdered != null) { ... }; 其中resultIEnumerable&lt;order&gt;
  • 是的,我会改变它。我对区域进行了硬编码;然后,我添加了一个参数以从下拉列表中选择区域。

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


【解决方案1】:

您使用.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();

【讨论】:

    猜你喜欢
    • 2011-10-07
    • 1970-01-01
    • 1970-01-01
    • 2017-11-19
    • 2015-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多