所以我有一个相对较大的数据集,我希望最终用户能够以某种方式进行自定义。
目前,数据分组如下:
var versusHistories =
from th in db.TeamHistories
where th.TeamOneName.ToLower() == team.ToLower()
group th by th.Date
into grp1
from grp2 in
(from th in grp1
group th by th.Event)
group grp2 by grp1.Key;
如果我想允许用户指定group by
条款,我该怎么做?
示例:
用户导航至http://example.com/search?team=AbcTeam&grpBy1=TeamTwo&grpBy2=Date
然后页面呈现此代码:
var versusHistories =
from th in db.TeamHistories
where th.TeamOneName.ToLower() == team.ToLower()
group th by th.TeamTwo
into grp1
from grp2 in
(from th in grp1
group th by th.Date)
group grp2 by grp1.Key;
如何动态提供此功能,而无需对每种可能性进行硬编码?
答案 0 :(得分:0)
使用方法语法,您可以执行以下操作:
var versusHistories =
from th in db.TeamHistories
where th.TeamOneName.ToLower() == team.ToLower()
if (condition)
{
versusHistories = versusHistories.GroupBy(g => ..something..);
}
else if (anotherCondition)
{
versusHistories = versusHistories.GroupBy(g => ..something else..);
}
我不确定纯查询语法是否可行/如何实现。
这可以防止您多次重复核心查询。
答案 1 :(得分:0)
这不是一个完整的广告,但您可以尝试使用反射并执行以下操作:
var listOfPropertiesToSortBy = new List<string>();
var versusHistories = from th in db.TeamHistories
where th.TeamOneName.ToLower() == team.ToLower();
foreach (var property in listOfPropertiesToSortBy ) {
versusHistories = versusHistories.GroupBy(vh => typeof(TeamHistories).GetProperty(property).GetValue(vh));
}
这个问题是每次遍历列表时,新的OrderBy语句将覆盖最后一个。需要有一种方式可以说。然后在第一个属性之后,我知道对于历史=与历史。然后(某些)是不有效的。也许有人可以采取这种方式并将其扩展一段时间为你工作。希望这可以帮助。