为什么LINQ不让我订购我的一个数据点?

时间:2014-01-18 00:14:27

标签: c# asp.net-mvc linq asp.net-web-api

我有这段代码:

return inventoryItems
    .Where(i => 0 < String.Compare(i.ID, ID))
    .Take(CountToFetch);

...但我想订购结果,如下:

return inventoryItems
    .Where(i => 0 < String.Compare(i.ID, ID))
    .Take(CountToFetch)
    .OrderBy(i.pksize);

...但是,最终i是红色/超出范围。为什么?尝试在OrderBy()之前定位Take()没有任何区别。

3 个答案:

答案 0 :(得分:6)

return inventoryItems.Where(i => 0 < String.Compare(i.ID, ID))
                     .Take(CountToFetch)
                     .OrderBy(i => i.pksize);

也许您应该更改OrderByTake命令以使结果可预测:

return inventoryItems.Where(i => 0 < String.Compare(i.ID, ID))
                     .OrderBy(i => i.pksize)
                     .Take(CountToFetch);

答案 1 :(得分:3)

i中没有OrderBy

您需要OrderBy(i => i.pksize)(或确实x => x.pksizewhatever => whatever.pksize等。)

允许from x in something where x.IsOkay orderby x.Priority等的语法一直使用相同的变量标签,但它变成了多个lambda表达式,每个表达式彼此分开。 (something.Where(x => x.IsOkay).OrderBy(x => x.Priority),但他们需要每个都是完整的表达。

答案 2 :(得分:1)

您似乎已尝试使用i中声明的Where。如果仔细查看括号,您应该会发现它实际上不再位于OrderBy范围内。所以第一个问题是您尝试使用超出范围的变量。

OrderBy实际上需要能够检查IEnumerable中每个元素的属性,因此仅传递 1的值元素的属性。它需要知道如何来获取每个元素的属性,这就是你通常传入lambda表达式,匿名委托或方法的原因。

正如其他人指出的那样,您可以像使用Where中那样使用lambda表达式来解决问题:

.OrderBy(i => i.pksize)