为什么ToList()在linq中不起作用?

时间:2012-10-23 13:27:32

标签: c# linq

我在使用多个字段排序数据时遇到问题

这是我使用的示例代码:

 var Item = from itm in DB.Items
select new Item
{
};
return Item.ToList().OrderBy(e => e.ExpiryDate).ToList();

上面的代码没有显示任何错误,但也没有使用expirydate字段排序:(

如果我这样使用

return Item.OrderBy(e => e.ExpiryDate).ToList();

这给出了一个错误,即sql不包含orderby的翻译

任何帮助

提前致谢

2 个答案:

答案 0 :(得分:6)

我认为这里有一些事情发生。首先,您已将结果变量命名为与select中创建的类相同。可能没有多大区别,但令人困惑。让我们改变它:

var items = from itm in DB.Items
            select new Item
            {
            };

接下来,您的DB.Items上下文已由Item个对象构建。您不需要创建新的。在上面的代码中,您的新Item对象无论如何都是空的。

var items = from itm in DB.Items
            select itm;

如果您想立即订购,也可以这样做:

var items = from itm in DB.Items
            orderby itm.ExpiryDate
            select itm;

如果您需要List,则可以在同一行中执行此操作:

var items = (from itm in DB.Items
             orderby itm.ExpiryDate
             select itm).ToList();

现在items将成为List ItemList<Item>个对象的具体{{1}}。

答案 1 :(得分:5)

您的代码使用默认构造函数创建Item的实例,而不将从DB获得的任何内容传递给它。这就是为什么你得到一个相同的空项目列表;对它们进行排序没有任何效果。

删除第一个Select以使其正常工作:

var Item = DB.Items; // No "Select ..."
return Item.ToList().OrderBy(e => e.ExpiryDate).ToList();

您的第一个ToList强制数据进入内存,可以应用OrderBy。您也可以使用AsEnumerable()调用替换它,以避免第二次在内存中创建列表:

return Item.AsEnumerable().OrderBy(e => e.ExpiryDate).ToList();