【问题标题】:Dynamic LINQ OrderBy for a Navigation Property using Expression in C#使用 C# 中的表达式的导航属性的动态 LINQ OrderBy
【发布时间】:2017-10-22 06:12:19
【问题描述】:

我有两张桌子,即学生和马克

表:DbSet<StudentInfo>

ID    Name
_____________________
1     Ram
2     Kumar
3     John

表:DbSet<ScoreInfo>

Id    StudentId    Subject    Score
_____________________________________
1     1            GK         90
2     1            SCI        97
3     2            GK         81
4     2            SCI        99

LINQ to SQL 返回以下列表

StudentId    Name    Subject    Score  
_____________________________________
1            Ram    GK         90
1            Ram    SCI        97
2            Kumar  GK         81
2            Kumar  SCI        99
3            John   null       null

C#代码是

using(var db = new StudentEntity()) {
    var query = db.Student.Where(m => true);

    Expression<Func<StudentInfo,object>> sortExpression = null;

    if(sortColumn == "Name") {
        sortExpression = i => i.Name
    } else if(sortColumn == "Subject") {
        // ? How to achieve this
    }

    query = isAcending
                ? query.OrderBy(sortExpression)
                : query.OrderByDescending(sortExpression);

    query.Select(m => (...)).Dump();
}

变量sortColumnString,指定需要排序的列,变量isAcendingbool,指定排序方向。

我需要对主题列进行排序。请帮助我如何编写Expression&lt;Func&lt;StudentInfo,object&gt;&gt;,查询应该是IQueryable

【问题讨论】:

  • 排序时不需要直接使用Expressions。只需使用 query.OrderBy(x => x.Subject);
  • 小迂腐点:升序有一个s

标签: c# linq sorting linq-to-sql iqueryable


【解决方案1】:

正是你编写 lambda 的方式:

Expression<Func<StudentInfo,object>> sortExpression = si=>si.Name;

(请注意,您不能在那里使用var,因为编译器需要知道您希望它作为Expression&lt;T&gt;

但您真正的问题是您正在尝试使用尚未创建的StudentInfo 对象。首先创建一个,然后按它排序;

 db.Mark.Select(m=> new StudentInfo {
                    StudentID = m.StudentId, 
                    Name = m.Student.Name,
                    Subject = m.Subject,
                    Score = m.Score});

Expression<Func<StudentInfo, object>> sortExpression = null;

if (sortColumn == "Name")
{
    sortExpression = i => i.Name;

}
else if (sortColumn == "Subject")
{
    sortExpression = i => i.Subject;
}

    query = isAcending
                ? query.OrderBy(sortExpression)
                : query.OrderByDescending(sortExpression);

    return query;

【讨论】:

  • 仅供参考,模型StudentInfo 是一个实体框架模型类,它与第一个表相关联。导航属性的工作方式类似于“左外连接”(即分数表)。我更新了问题。
【解决方案2】:

您可以将字符串传递给 OrderBy 方法, 像

"colName ASC, anotherCol Desc, etc..."

你可以这样做,

string orderstring = sortColumnName +" "+ (isAcending ?? "ASC" : "DESC"); query = query.OrderBy(orderstring);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多