我正在使用LINQ来聚合对象:
var summary = from esc in objs
where esc.time.Month == month && esc.time.Year == year
group esc by esc.rlf_id into g
select new {
ID = g.Key,
Total = g.Count(),
Preventable = g.Where(a => a.preventable).Count()
};
我的查询按预期工作,但我也想通过匿名类型中的任意字段对查询进行排序。我找到了LINQ: Order By Anonymous Type,但它在VB.NET中,需要强烈指定要排序的字段。我可以将此伪代码概念化:
query = get all esc in obj
aggregate into anonymous type with key ID
ID = g.Key, Total = g.Count, Preventable = g.Count of preventable
orderby inputField[0], (optional thenby inputField[1], ..., thenby inputField[n])
我如何完成:
编辑:有了Marko Stanojevic的回答,我就能部分满足我的要求。我没有意识到我能够像这样将LINQ方法链接在一起。我现在可以(并从中获得预期的结果):
var summary = from esc in objs
where esc.time.Month == month && esc.time.Year == year
group esc by esc.rlf_id into g
select new {
ID = g.Key,
Total = g.Count(),
Preventable = g.Where(a => a.preventable).Count()
};
summary = summary.OrderBy(e => e.Total);
我需要让我做的事情:(伪代码)
summary = summary.<Order/Then>By<(optional)Descending>(e => e.<someUserInput>)
给出一些指定用户希望如何排序的字符串,显然我可以做到:
if (sortQuery.Equals("Total", StringComparison.OrdinalIgnoresCase), bool descending) {
summary = descending ? summary.OrderByDescending(e => e.Total) : summary.OrderBy(e => e.total)
} else if (sortQuery.Equals( /* ... etc */
但是,这最终变得很丑陋,尤其是因为我想将其用于(可能几乎无限)不断增长的查询数量。还需要考虑OrderBy()
与ThenBy()
。
我希望我正在使用C#4,以便现在就可以使用动态...
我正在使用LINQ to Objects进行汇总:var summary =来自obj中的esc,其中esc.time.Month == month && esc.time.Year == year esc by esc.rlf_id到...
困难在于仅在运行时知道要调用的方法(例如OrderBy
或OrderByDescending
)及其参数(例如keySelector item => item.MyFieldName
)。>
解决方案是使用反射
summary = summary.OrderBy(s => s.Total).ToList();
尝试一下: