根据变量选择一列

时间:2014-05-08 16:33:23

标签: c# linq-to-sql

我正在寻找一种使用指定值访问变量列的方法。我有一个与我的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请求的解决方案吗?

1 个答案:

答案 0 :(得分:1)

研究使用Dynamic 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/