如何使用Entity Framework Dynamic" SortBy"复杂对象上的字符串?

时间:2017-02-13 15:29:10

标签: c# asp.net-mvc entity-framework linq sorting

我正在编写一个实体框架查询,该查询映射到对象的复杂对象。我正在使用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
                              };

1 个答案:

答案 0 :(得分:5)

使用纯Linq的简单方案:

如果你的场景更简单,你根本不需要动态,你可以这样做:

query = query.OrderBy(i => i.item.item_id);
// OR
query = query.OrderByDescending(i => i.item.item_id);

..将使用该属性本身。

“动态Linq”的动态场景

如果你真的需要动态(这意味着你必须按任何字段排序并且不想在你的代码中添加很多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()方法(如我的例子中所示)。

请注意itemItemInfo内的属性名称相同。此外,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中,保留所需的属性,因此每次都不会从数据库中不必要地加载所有字段。