是LINQ .OrderBy()。ThenBy()当原始Query使用ORDER BY子句时,运算符是多余的?

时间:2013-11-22 21:44:05

标签: c# sql performance linq ienumerable

如果我用来填充通用List的SQL查询命令结果集如此(List<InventoryItem> inventoryItems已填充):

SELECT id, pack_size, description, department+(subdepartment/100) AS Dept, vendor_id, vendor_item, ave_cost, unit_list FROM t_inv ORDER BY id, pack_size

...它是多余的(在我看来它是,但我想验证它)在后续LINQ代码中使用 .OrderBy()。ThenBy(),如下所示:< / p>

public IEnumerable<InventoryItem> Get(string ID, int packSize, int CountToFetch)
{
    return inventoryItems
        .Where(i => (i.Id.CompareTo(ID) == 0 && i.PackSize > packSize) || i.Id.CompareTo(ID) > 0)
        .OrderBy(i => i.Id)
        .ThenBy(i => i.PackSize)
        .Take(CountToFetch);
}

我可能负担得起为此提供的微量额外Purina Gerbil Chow,但是(如果你愿意的话,叫我PETA宠物)我仍然宁愿不必浪费能源。

2 个答案:

答案 0 :(得分:3)

如果要对数据库中的数据进行排序,则无需再次对其进行排序

答案 1 :(得分:3)

由于作为LINQ查询源的SQL查询是代码的一部分,并且因为您确定要对这些记录进行排序,所以没有必要在LINQ中强制执行排序。 。如果有的话,添加一个调试断言来检查数据是否正确排序,并在生产中关闭debug assertions

它背后的哲学是你应该只有一段代码负责每一项功能。如果有人修改了您的查询以使项目无序,他很可能无法理解您在做什么。最好通过断言立即指出,而不是在代码的LINQ部分用“腰带和吊带”排序来掩盖它。

不言而喻,像这样的决策需要有详细记录:您需要添加一条注释,说明您的函数期望其输入数据以特定方式排序,并且提供未排序数据是错误。< / p>