根据变量选择列

本文关键字:选择 变量 | 更新日期: 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/