【发布时间】:2015-11-10 13:06:29
【问题描述】:
我有一个数据库,用户可以在该数据库上运行各种计算。计算在 4 个不同的列上运行,每个计算不一定使用每一列,即,calculation1 可能会变成类似 sql
SELECT SUM(Column1)
FROM TABLE
WHERE Column1 is not null
计算 2 是
SELECT SUM(Column2)
WHERE Column2 is null
我正在尝试通过 linq 生成它,我可以通过每次计算所有内容来获取正确的数据,例如
table.Where(x => x.Column1 != null)
.Where(x => x.Column2 == null)
.GroupBy(x => x.Date)
.Select(dateGroup => new
{
Calculation1 = dateGroup.Sum(x => x.Column1 != null),
Calculation2 = dateGroup.Sum(x => x.Column2 == null)
}
问题是我的数据集非常大,所以除非用户请求,否则我不想执行计算。我研究了动态生成 Linq 查询。到目前为止,我发现的只是 PredicateBuilder 和 DynamicSQL,它们似乎只对动态生成 Where 谓词有用,并将 sql 查询本身硬编码为字符串,并在必要时插入 Sum(Column1) 或 Sum(Column2)。
如何将 Select 查询的不同部分动态添加到这样的匿名类型中?或者我应该寻找一种完全不同的方式来处理这个问题
【问题讨论】:
-
除了动态创建查询之外,您能否将它们封装到自己的方法中并有条件地调用这些方法?
-
看看 Dynamic LINQ:dynamiclinq.azurewebsites.net。它允许在许多 LINQ 操作中使用动态子句,包括
Select。 -
我对 Dynamic Linq 进行了一些研究。我在那里查看了您的链接,但摆脱类型安全似乎是我只想在必须时做出的选择
标签: c# sql-server linq dynamic