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

时间:2017-05-29 10:20:00

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

我有一张桌子即 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);
}

抛出异常

  

&#34;无法转换类型&System; Int.322&#39;键入&#39; System.Object&#39;。 LINQ   to Entities仅支持转换EDM原语或枚举类型。&#34;

如果我在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;
}

请帮助我...

4 个答案:

答案 0 :(得分:1)

有一些要点需要考虑:

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

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

答案 1 :(得分:0)

尝试替换以下代码:

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

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

答案 2 :(得分:0)

你可以扩展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");

答案 3 :(得分:0)

您可以在github https://github.com/PoweredSoft/DynamicLinq

中使用此功能

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

简单排序

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