我有一个数据库,用户可以在其上运行各种计算。计算在 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 查询的不同部分动态添加到这样的匿名类型中?或者我应该寻找一种完全不同的方式来处理这个问题
您可以在不执行查询的情况下返回查询,这将允许您动态选择要返回的内容。
也就是说,您无法在运行时动态修改匿名类型。它们在编译时是静态类型的。但是,您可以使用不同的返回对象来允许动态属性,而无需外部库。
var query = table
.Where(x => x.Column1 != null)
.Where(x => x.Column2 == null)
.GroupBy(x => x.Date);
然后,您可以使用以下任一方法动态解析查询:
-
dynamic
dynamic returnObject = new ExpandoObject();
if (includeOne)
returnObject.Calculation1 = groupedQuery.Select (q => q.Sum(x => x.Column1));
if (includeTwo)
returnObject.Calculation2 = groupedQuery.Select (q => q.Sum (x => x.Column2));
-
具体类型
var returnObject = new StronglyTypedObject();
if (includeOne)
returnObject.Calculation1 = groupedQuery.Select (q => q.Sum(x => x.BrandId));
Dictionary<string, int>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)