【问题标题】:OrderBy an INT Column in LINQ to Entities using dynamic Expression in C#OrderBy 使用 C# 中的动态表达式在 LINQ to Entities 中的 INT 列
【发布时间】:2017-05-29 10:20:00
【问题描述】:

我有一张桌子,即 StudentInfo

表:DbSet<StudentInfo>

ID    Name
_____________________
1     Ram
2     Kumar

我的 C# 代码是

using(var db = new Entities()) {

    Expression<Func<StudentInfo,object>> sortColumn = i => i.ID;

    IQueryable<StudentInfo> qryStudent = db.StudentInfos.Where(i => true)
                                                 .OrderBy(sortColumn);
}

抛出异常

“无法将类型 'System.Int32' 转换为类型 'System.Object'。LINQ to Entities 仅支持转换 EDM 基元或枚举类型。”

如果我在表达式中修改 i =&gt; i.ID.ToString() 之类的代码,它的工作原理

using(var db = new Entities()) {

    Expression<Func<StudentInfo,object>> sortColumn = i => i.ID.ToString();

    IQueryable<StudentInfo> qryStudent = db.StudentInfos.Where(i => true)
                                                 .OrderBy(sortColumn);
}

如何以正确的方式解决此问题。

我需要一个通用的解决方案,表达式应该是 Expression&lt;Func&lt;StudentInfo,dynamic&gt;&gt; 像这样。两者都应该匹配

switch(sortKey) {
    case "ID"
        sortColumn = i => i.ID;
        break;
    case "Name"
        sortColumn = i => i.Name;
        break;
}

请帮助我...

【问题讨论】:

  • Expression&lt;Func&lt;StudentInfo,object&gt;&gt;改成Expression&lt;Func&lt;StudentInfo,int&gt;&gt;能用吗?

标签: c# linq lambda linq-to-sql linq-to-entities


【解决方案1】:

有几点需要考虑:

  • Where(i =&gt; true) 只需要所有元素,这不是必需的
  • 为什么你使用你的id的字符串值?如果它是一个整数,您可以将表达式更改为以下内容: Expression&lt;Func&lt;StudentInfo, int&gt;&gt; sortColumn = i =&gt; i.ID;

请尝试描述您的完整问题。所以它更容易回答,你可能会更快地获得帮助:)

【讨论】:

    【解决方案2】:

    尝试替换以下代码:

    Expression<Func<StudentInfo, object>> sortColumn = i => Convert.ToInt32(i.ID);
    

    问题在于将对象类型的数据转换为整数类型。

    【讨论】:

    • 它抛出了同样的异常。
    【解决方案3】:

    您可以扩展 IQueryable 以添加一个自定义 OrderBy,它采用这样的排序键

        public static IQueryable OrderBy(this IQueryable<StudentInfo> queryable, string sortKey)
        {
            switch (sortKey)
            {
                case "ID":
                    return queryable.OrderBy(i => i.ID);
                case "Name":
                    return queryable.OrderBy(i => i.Name);
            }
    
            return queryable;
        }
    

    有了这个,你可以像这样使用你的排序键来做一个订单

        var students = db.StudentInfos.OrderBy(sortColumn, "ID");
    

    【讨论】:

    • 我认为最后一行应该是var students = db.StudentInfos.OrderBy("ID");var students = db.StudentInfos.OrderBy(sortKey);
    【解决方案4】:

    你可以从 github https://github.com/PoweredSoft/DynamicLinq使用这个

    或 Nuget https://www.nuget.org/packages/PoweredSoft.DynamicLinq/

    简单排序

    query = query.OrderByDescending("AuthorId");
    query = query.ThenBy("Id");
    

    【讨论】:

      猜你喜欢
      • 2016-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-20
      相关资源
      最近更新 更多