动态/有条件地添加多个LINQ GroupBy
我有一个用户界面,可以让用户选择 几乎相同列集的两个表之间的表类型选择 柱 运算和、平均值、中值等。 GroupBy选项包含一组复选框 我计划创建一个基于用户选择返回resultset的方法,虽然我认为除了表选择之外,我已经完成了所有其他工作,但我仍然坚持使用GroupBy或任何其他方法一个接一个地构建GroupBy子句 这是唯一一件让我现在想回到使用简单的SQL字符串生成来实现这一点的事情 以下是我目前掌握的代码:动态/有条件地添加多个LINQ GroupBy,linq,dynamic,group-by,conditional,Linq,Dynamic,Group By,Conditional,我有一个用户界面,可以让用户选择 几乎相同列集的两个表之间的表类型选择 柱 运算和、平均值、中值等。 GroupBy选项包含一组复选框 我计划创建一个基于用户选择返回resultset的方法,虽然我认为除了表选择之外,我已经完成了所有其他工作,但我仍然坚持使用GroupBy或任何其他方法一个接一个地构建GroupBy子句 这是唯一一件让我现在想回到使用简单的SQL字符串生成来实现这一点的事情 以下是我目前掌握的代码: public IQueryable<ACSImpactAnalysisM
public IQueryable<ACSImpactAnalysisModel> GetDataForReport(TableType table, uint year, OpType operation, uint groupOptions, uint measures)
{
var dataContext = new ACSImpactEntities();
var discharges = from p in dataContext.ACSNationals
select new
{
p.YEAR,
p.AGE,
p.FEMALE,
p.RACE,
p.ASOURCE,
p.PAY1,
LOS = p.LOS > 0 ? p.LOS : 0,
CHG = p.TOTCHG > 0 ? p.TOTCHG : 0,
NPR = p.NPR > 0 ? p.NPR : 0,
DIS_STS = p.DISPUB04 > 0 ? p.DISPUB04 : 0
};
//if (table == TableType.states)
// discharges = from p in dataContext.ACSStates
// select p;
List<int> years = new List<int>();
if ((year & Constants.YEAR2008) == Constants.YEAR2008) years.Add(2008);
if ((year & Constants.YEAR2009) == Constants.YEAR2009) years.Add(2009);
discharges = discharges.Where(a => years.Any(b => a.YEAR == b));
if ((groupOptions & Constants.SEX) == Constants.SEX)
discharges = discharges.Where(a => a.FEMALE > 0);
if ((groupOptions & Constants.RACE) == Constants.RACE)
discharges = discharges.Where(a => a.RACE > 0);
if ((groupOptions & Constants.ER_ADMISSION) == Constants.ER_ADMISSION)
discharges = discharges.Where(a => a.ASOURCE > 0);
if ((groupOptions & Constants.PAYER_TYPE) == Constants.PAYER_TYPE)
discharges = discharges.Where(a => a.PAY1 > 0);
var analysis = from a in discharges
select new
{
AGE_GROUP =
(
a.AGE >= 18 && a.AGE <= 44 ? "18-44" :
a.AGE >= 45 && a.AGE <= 54 ? "45-54" :
a.AGE >= 55 && a.AGE <= 64 ? "55-64" : ">= 65"
),
SEX = (a.FEMALE == 1 ? "FEMALE" : "MALE"),
RACE =
(
a.RACE == 1 ? "WHITE" :
a.RACE == 2 ? "BLACK" :
a.RACE == 3 ? "HISPANIC" :
a.RACE == 4 ? "ASIAN OR PACIFIC ISLANDER" :
a.RACE == 5 ? "NATIVE AMERICAN" :
a.RACE == 6 ? "OTHER" : ""
),
ASOURCE = (a.ASOURCE == 1 ? "ER" : "NON ER"),
PAY1 =
(
a.PAY1 == 1 ? "MEDICARE" :
a.PAY1 == 2 ? "MEDICAID" :
a.PAY1 == 3 ? "PRIVATE INCLUDE HMO" :
a.PAY1 == 4 ? "SELF PAY" :
a.PAY1 == 5 ? "NO CHARGE" :
a.PAY1 == 6 ? "OTHER" : ""
),
a.YEAR,
a.FEMALE,
a.LOS,
a.CHG,
a.NPR,
a.DIS_STS
};
var grouped_analysis = analysis.GroupBy(groups => groups.YEAR);
//These lines generate error, but this is something what I want to be able to do
if ((groupOptions & Constants.AGE_GROUP) == Constants.AGE_GROUP)
grouped_analysis = analysis.GroupBy(age_group => age_group.AGE_GROUP);
if ((groupOptions & Constants.ASOURCE) == Constants.ASOURCE)
grouped_analysis = analysis.GroupBy(asource => asource.ASOURCE);
return analysis;
}
您可以使用,也可能需要 关于动态Linq,它不会破坏编写类型安全查询的全部目的吗?至于谓词生成器,我无法理解它如何有助于将多个条件group BY添加到结果集。在处理此类查询时,了解谓词生成器似乎更适合构建动态where/filter子句,是的,对于WhereDynamicLinq,groupby有一个扩展方法。我在这里看到了样本,所以。嗯。。。我想动态Linq是下一个最好的选择。理想情况下,我希望有多个GroupBy调用,一个接一个,就像我使用条件where子句一样。在使用Dynamic Linq和您的解决方案之前,我会仔细考虑它,并尝试找到更多选项。谢谢。在花了大量时间寻找Linq动态查询库的适当文档之后,我发现很难使用它,而且它甚至没有比使用基于字符串的查询生成提供任何显著的好处,我可能不得不重新使用后者。不过,感谢您为我指出了任何可用的备选方案。