我在使用多个字段对数据进行排序时遇到问题
这是我用过的示例代码:
var Item = from itm in DB.Items
select new Item
{
};
return Item.ToList().OrderBy(e => e.ExpiryDate).ToList();
Run Code Online (Sandbox Code Playgroud)
上面的代码没有显示任何错误,但也没有与expirydate字段排序:(
如果我这样使用
return Item.OrderBy(e => e.ExpiryDate).ToList();
Run Code Online (Sandbox Code Playgroud)
这给出了一个错误,即sql不包含orderby的翻译
任何帮助
提前致谢
我想这里有几件事情要发生.首先,您已将结果变量命名为与您在其中创建的类相同select.可能没有多大区别,但令人困惑.让我们改变它:
var items = from itm in DB.Items
select new Item
{
};
Run Code Online (Sandbox Code Playgroud)
接下来,您的DB.Items上下文已经构建了Item对象.您不需要创建新的.在上面的代码中,Item无论如何,您的新对象都是空的.
var items = from itm in DB.Items
select itm;
Run Code Online (Sandbox Code Playgroud)
如果您想立即订购它们,您也可以这样做:
var items = from itm in DB.Items
orderby itm.ExpiryDate
select itm;
Run Code Online (Sandbox Code Playgroud)
如果您需要它List,您可以在同一行中执行此操作:
var items = (from itm in DB.Items
orderby itm.ExpiryDate
select itm).ToList();
Run Code Online (Sandbox Code Playgroud)
现在items将是一个具体List的Item对象(List<Item>).
您的代码创建Item使用默认构造函数的实例,而不将从DB获得的任何内容传递给它.这就是为什么你得到一个相同的空项目列表; 对它们进行排序无效.
删除第一个Select以使其工作:
var Item = DB.Items; // No "Select ..."
return Item.ToList().OrderBy(e => e.ExpiryDate).ToList();
Run Code Online (Sandbox Code Playgroud)
您的第一个ToList强制数据进入内存,OrderBy可以应用于何处.您也可以将其替换为AsEnumerable()呼叫,以避免第二次在内存中创建列表:
return Item.AsEnumerable().OrderBy(e => e.ExpiryDate).ToList();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
953 次 |
| 最近记录: |