动态分组按字符串引用的属性

时间:2016-02-11 22:39:10

标签: c# asp.net linq

所以我有一个相对较大的数据集,我希望最终用户能够以某种方式进行自定义。

目前,数据分组如下:

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;

如何动态提供此功能,而无需对每种可能性进行硬编码?

2 个答案:

答案 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语句将覆盖最后一个。需要有一种方式可以说。然后在第一个属性之后,我知道对于历史=与历史。然后(某些)是不有效的。也许有人可以采取这种方式并将其扩展一段时间为你工作。希望这可以帮助。