如何在没有命名列的情况下对匿名类型进行排序

时间:2014-02-12 22:51:50

标签: c# linq sorting

从这个问题构建:Trying to concatenate columns in LINQ

现在我要排序:

var orderByIndexVal = Convert.ToInt32(Request["iSortCol_0"]);
var direction = Request["sSortDir_0"];

var gridInfo = 
    from leader in db.SchoolLdrAdminAccesses
        join emp in db.Employees
        on leader.ID equals emp.ID
        select new List<string> { leader.ID, emp.FirstName + " " + emp.LastName };

 return Json(new
        {
           sEcho = param.sEcho,
           iTotalRecords = gridInfo.Count(),
           iTotalDisplayRecords = gridInfo.Count(),
           aaData = gridInfo.ToArray()
         },
         JsonRequestBehavior.AllowGet);

阅读本文后: LINQ sorting anonymous types?

我的问题是我的gridInfo

中没有任何名称

到目前为止我尝试了什么:

            if (direction == "asc")
            {
                gridInfo =  gridInfo.OrderBy(gi => gi[orderByIndexVal]);
            }
            else
            {
                gridInfo = gridInfo.OrderByDescending(gi => gi[orderByIndexVal]);
            }

但我收到以下错误:

  

LINQ to Entities无法识别方法'System.String   get_Item(Int32)'方法,并且此方法无法转换为   商店表达。

在以下代码块中:

            return Json(new
            {
                sEcho = param.sEcho,
                iTotalRecords = gridInfo.Count(),
                iTotalDisplayRecords = gridInfo.Count(),
                aaData = gridInfo.ToArray()
            },
            JsonRequestBehavior.AllowGet);

2 个答案:

答案 0 :(得分:3)

您需要具体化列表,因此order by不会发生在数据库中,而是在.NET中,在连接发生之后。

var gridInfo = (from leader in db.SchoolLdrAdminAccesses
        join emp in db.Employees
        on leader.ID equals emp.ID
        select new string[]{ leader.ID.ToString(), 
             emp.FirstName + " " + emp.LastName })
        .ToList();

另请注意,使用数组而不是列表会占用更少的内存。希望有所帮助。

答案 1 :(得分:0)

我认为这是问题

new List<string> { leader.ID, emp.FirstName + " " + emp.LastName };

您选择的匿名类型是两列{Int,String}而不是简单列表

只需Select new { leader.ID, emp.FirstName + " " + emp.LastName }; Select语句会自动将其设为IEnumerable,因此您不需要List&lt;&gt;部分

我假设leader.ID在这里是一个Int(可能是错误的)