【问题标题】:How does one sort using Entity Framework Dynamic "SortBy" string on a complex object?如何在复杂对象上使用实体框架动态“SortBy”字符串进行排序?
【发布时间】:2017-02-13 15:29:09
【问题描述】:

我正在编写一个实体框架查询,它映射到一个复杂的对象对象。我正在使用 jquery 数据表,它将查询排序作为典型的字符串动态传递,例如“item_id”或“item_id DESC”。当传递到 SoryBy 子句时,它将数据库结果排序为项目 id 列。如果这是基本对象,这很好,但如果我有一个包含该对象的包装器对象,它会说项目 id 没有为类型 ItemInfo 定义。

类的模型如下。

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
                              };

【问题讨论】:

  • 选择 ItemId=i.item_id 然后将其传递给像 order by i.item_id 这样的子句顺序
  • @BradleyUffner 看起来该代码在实体框架 SQL Server 上不起作用。看起来这是一个纯 c# 解决方案。

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


【解决方案1】:

使用纯 Linq 的更简单场景:

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

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

..这将使用属性本身。


带有“Dynamic Linq”的动态场景

如果您真的需要动态(这意味着您必须按任何字段排序并且不想在代码中放置大量 ifs),那么您需要安装此软件包 System.Linq.Dynamic by在包管理器控制台中运行它:

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,因为你可以通过 ASCDESC 将字符串传递给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 中,准确地保留您需要的属性,这样您就不会每次都从数据库中不必要地加载所有字段。

【讨论】:

  • 两个问题。 1.如果作为字符串传入,order by do desc 吗?我看到了一个 orderbydescending,我不确定是否需要在 orderby 上使用它。 2.我的order by除了一个字符串参数。我需要添加一个 using 语句来获得它吗?我得到:无法从用法中推断方法 'System.Linq.Enumerable.OrderBy(System.Collections.Generic.IEnumerable, System.Func)' 的类型参数。尝试明确指定类型参数。
  • @SolidSnake4444 当我看到你提到dynamic时,我以为你已经在使用System.Linq.Dynamic;了。我编辑了我的答案。
  • 如果你还需要ThenBy(),这个是github.com/StefH/System.Linq.Dynamic.Core支持的
猜你喜欢
  • 1970-01-01
  • 2016-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多