在CQ中使用动态表达式在LINQ to Entities中使用INT列

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在CQ中使用动态表达式在LINQ to Entities中使用INT列相关的知识,希望对你有一定的参考价值。

我有一张桌子,特别是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原语或枚举类型。”

如果我在Expression中修改像i => 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应该像这样Expression<Func<StudentInfo,dynamic>>。它应该匹配两者

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

请帮助我......

答案

有一些要考虑的要点:

  • qazxsw poi只需要所有元素,这是不必要的
  • 为什么使用id的字符串值?如果它是一个整数,您可以将表达式更改为以下:Where(i => true)

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

另一答案

尝试替换以下代码:

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

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

另一答案

你可以扩展IQueryable以添加一个自定义OrderBy,它接受这样的排序键

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

有了这个,您可以使用这样的排序键来执行订单

    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;
    }
另一答案

你可以从github var students = db.StudentInfos.OrderBy(sortColumn, "ID"); 使用它

或Nuget https://github.com/PoweredSoft/DynamicLinq

简单的排序

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

以上是关于在CQ中使用动态表达式在LINQ to Entities中使用INT列的主要内容,如果未能解决你的问题,请参考以下文章

LINQ to Entities 不支持 LINQ 表达式节点类型“Invoke”

如何为CriteriaOperator过滤对象转换为lambda表达式,即:linq to xpo的动态where语句

在实体框架和 Linq to Entities 中使用规范模式和表达式

LINQ to Entities OrderBy 表达式树

如何在 Linq to SQL 表达式中使用 SQL 的 GETDATE() 和 DATEADD()?

在 LINQ to Entities 中重用选择表达式