根据变量选择列
本文关键字:选择 变量 | 更新日期: 2023-09-27 18:02:29
我正在寻找一种使用指定值访问变量列的方法。我有一个与SQL数据库1:1匹配的数据结构:
class Message
{
int MessageId;
string MessageType;
/* more fields */
double? Metric1;
double? Metric2;
/* cont'd */
double? Metric10;
/* database computed values */
int Year;
int Month;
int Day;
}
我如何使用LINQ to SQL,根据变量的值对特定的"Metric n"字段进行聚合(Sum, Average) ?
的例子:
/* DataContext Messages; */
int metric = 2;
var results = Messages
.GroupBy(m => new { m.Year, m.Month })
.Select(g => new {
Year = g.Key.Year,
Metric = g.Sum(m => m.MetricN) /* Here, MetricN should reflect the
value of (int metric) ("Metric" + metric) */
});
要求:
- (int metric)是动态设置的(事先不知道,即我正在根据名称从Metrics定义表中获取值)。
- MetricN字段总是相同的类型。
- 语法流畅优先。
我知道把指标放在一个单独的表中(有列(MessageID, Metric和Value))会简化请求,但这是我必须使用的数据结构。
是我唯一的解决方案,手写我的SQL请求?
考虑使用动态LINQ。它允许你使用字符串表达式而不是Lambda表达式。
它最终看起来像这样:
var results = Messages
.GroupBy(m => new { m.Year, m.Month })
.Select("new (Key.Year as Year, Sum(Metric1) as Metric)");
你只需要在查询之外生成选择表达式字符串,无论你想要这样做。
Nuget上有一个动态LINQ的版本:https://www.nuget.org/packages/System.Linq.Dynamic.Library/