我正在编写一个实体框架查询,该查询映射到对象的复杂对象。我正在使用jquery数据表,它动态地将查询排序作为字符串传递,例如" item_id"或" item_id DESC"。当传入SoryBy子句时,它将数据库结果排序为项目id列。如果它是基础对象,这很好,但是如果我有一个包含该对象的包装器对象,则表示没有为ItemInfo类型定义item id。
类的模型如下。
public class Item {
public int item_id { get; set; }
public int category_id { get; set; }
}
public class ItemCategory {
public String category { get; set; }
public int category_id { get; set; }
}
public class ItemInfo {
public Item item { get; set; }
public ItemCategory category { get; set; }
}
.SortBy子句的字符串需要在ItemInfo查询中从Item获取item_id是什么?
IQueryable<ItemInfo> query = (from i in Item
join c in ItemCategory on i.category_id equals c.category_id
select new ItemInfo() {
item = i,
category = c
};
答案 0 :(得分:5)
如果你的场景更简单,你根本不需要动态,你可以这样做:
query = query.OrderBy(i => i.item.item_id);
// OR
query = query.OrderByDescending(i => i.item.item_id);
..将使用该属性本身。
如果你真的需要动态(这意味着你必须按任何字段排序并且不想在你的代码中添加很多if
),那么你需要安装这个包{{ 3}}在程序包管理器控制台中运行它:
Install-Package System.Linq.Dynamic
然后添加此using
子句:
using System.Linq.Dynamic;
然后您可以通过以下方式实现动态排序:
query = query.OrderBy("item.item_id DESC"); // keep the IQueryable
// OR
var items = query.OrderBy("item.item_id DESC").ToList(); // order in database...
使用此动态库时,没有OrderByDescending
,因为您可以传递 ASC 或 DESC ,并将字符串传递给OrderBy()
方法(如我的例子中所示)。
请注意item
与ItemInfo
内的属性名称相同。此外,ToList()
只是一个示例,实际上您根本不需要它,具体取决于您的方案。
虽然我建议您将ItemInfo
更改为:
public class ItemInfo {
public int item_id { get; set; }
public int category_id { get; set; }
}
...然后修复您的查询以相应地填充:
IQueryable<ItemInfo> query = (from i in Item
join c in ItemCategory on i.category_id equals c.category_id
select new ItemInfo() {
item_id = i.item_id,
category_id = c.category_id
};
query.OrderBy("item_id DESC");
在我看来,这看起来更简单,更清晰。我会避免将整个对象放在ItemInfo
中,保留所需的属性,因此每次都不会从数据库中不必要地加载所有字段。