Linq to sql LINQ查询或存储过程,以返回指定列中的最大值

Linq to sql LINQ查询或存储过程,以返回指定列中的最大值,linq-to-sql,stored-procedures,dynamic-linq,Linq To Sql,Stored Procedures,Dynamic Linq,桌状 datetime a1 b1 x2 ... 07-01-2009 13:10 8 9 10 07-01-2009 13:11 8 8 2 07-01-2009 13:12 9 1 1 全天每秒1行(=86400行)~40列;所有相同格式 我正在寻找一种方法来检索列指定的最大值和时间 我正在寻找一种方法来检索列在某个时间范围内指定的最大值和相应时间 差不多 Select top 1 time,a1

桌状

datetime          a1   b1   x2 ...  
07-01-2009 13:10   8    9    10  
07-01-2009 13:11   8    8    2  
07-01-2009 13:12   9    1    1    
全天每秒1行(=86400行)~40列;所有相同格式
我正在寻找一种方法来检索列指定的最大值和时间

我正在寻找一种方法来检索列在某个时间范围内指定的最大值和相应时间

差不多

Select top 1 time,a1 from table
    where (datetime>=begin and datetime<end) 
    order by a1 desc   
从表中选择前1个时间,a1

其中(datetime>=begin and datetime如果希望列名是动态的,则可能需要从中使用。然后可以指定要排序的列的名称

var query = context.table
                   .Where( t = t.begin <= date && date < t.end )
                   .OrderBy( "a1 desc" )
                   .Take(1)
                   .SingleOrDefault();
var query=context.table
其中(t=t.begin在SQL中:

select max(a1)
from table
where (datetime>=begin and datetime<end) 
选择最大值(a1)
从桌子上

其中(datetime>=begin和datetime我认为这会起作用。基本上使用函数将列返回到order by

var result = Table
                .OrderByDescending( row => GetColumnOfInterest(row) )
                .First()
                .dateTime;

int GetColumnOfInterest( Row row )
{
   if ( ... )
   {
      return row.a1;
   }
   else if ( ... )
   {
      return row.b1;
   }
}
那么:

IEnumerable<Table> results = Table;

switch ( condition )
{
    condition 1:
        results = results.OrderByDescending( row => row.a1 );
    condition 2:
        results = results.OrderByDescending( row => row.a2 );
    condition 3:
        results = results.OrderByDescending( row => row.a3 );

    ....

}

var result = results.First().dateTime;
IEnumerable结果=表格;
开关(条件)
{
条件1:
结果=结果.OrderByDescending(行=>row.a1);
条件2:
结果=结果.OrderByDescending(行=>row.a2);
条件3:
结果=结果.OrderByDescending(行=>row.a3);
....
}
var result=results.First().dateTime;

@Alex:我认为这意味着订单必须在客户端处理,LINQ-to-SQL无法将其转换为SQL。这与Richard的答案非常相似,他在那里构建了一个colSelector。
Expression<Func<TableType, ColumnType>> colSelector = null;
switch (column) {
  case "a1":
    colSelector = t => t.a1;
    break;
  case "b2":
    colSelector = t => t.b2;
    break;
  ...
}
var res = datacontext.Table
                     .Where(t => t.datetime >= begin && t.datetime < end)
                     .Max(colSelector);
var result = Table
                .OrderByDescending( row => GetColumnOfInterest(row) )
                .First()
                .dateTime;

int GetColumnOfInterest( Row row )
{
   if ( ... )
   {
      return row.a1;
   }
   else if ( ... )
   {
      return row.b1;
   }
}
IEnumerable<Table> results = Table;

switch ( condition )
{
    condition 1:
        results = results.OrderByDescending( row => row.a1 );
    condition 2:
        results = results.OrderByDescending( row => row.a2 );
    condition 3:
        results = results.OrderByDescending( row => row.a3 );

    ....

}

var result = results.First().dateTime;