2009-07-02 63 views
2

表等每秒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 from table 
    where (datetime>=begin and datetime<end) 
    order by a1 desc 

工作,但我不能使用列作爲參數。

LINQ解決方案或SP會很棒。

排序整個數據集以檢索最大值時,是否必須擔心性能?也許MAX函數會更快。

UPDATE

我試圖實現它的動態LINQ的方式,像蒂莫西(tvanfossen)建議

Dim q2 = context.table _ 
    .Where("t >= @0 AND t < @1", begin, end) _ 
    .OrderBy("@0 desc", col) _ 
    .Take(1) _ 
    .Select(col) 

但這返回表中的第一個值。 這將返回時間範圍內的第一個值,而不是最大值。看一下SQL分析器,我發現沒有ORDER子句。
有什麼想法?

UPDATE 2
由於某些原因,替換值在orderby子句中不起作用。
.OrderBY(COL +「降序」)的作品

回答

1

如果你想列名是動態的,你可能想使用Dynamic LinqVS2008 code samples。然後,您可以指定要排序的列的名稱。

var query = context.table 
        .Where(t = t.begin <= date && date < t.end) 
        .OrderBy("a1 desc") 
        .Take(1) 
        .SingleOrDefault(); 
2

在SQL:

select max(a1) 
from table 
where (datetime>=begin and datetime<end) 

你不需要進行排序,只需要使用標準的聚合函數。爲了能夠動態選擇列,您需要動態創建SQL,並使用字符串連接,但要非常小心以確保列名實際上是列名,而不是SQL注入。

在LINQ,再有一個聚合使用:

var res = datacontext.Table 
        .Where(t => t.datetime >= begin && t.datetime < end) 
        .Max(t => t.a1); 

傳遞給最大Lambda表達式選擇列來獲得的最大值。爲了處理動態選擇的列有兩條路:

首先,你可以建立在作品的表達,好,如果有一個小的固定組列:

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); 

或者,第二個選項:建立用表達式API表達你自己。詳情請看這裏:http://www.albahari.com/nutshell/predicatebuilder.aspx

0

我認爲這樣會起作用。基本上使用一個函數來返回列的順序。

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

int GetColumnOfInterest(Row row) 
{ 
    if (...) 
    { 
     return row.a1; 
    } 
    else if (...) 
    { 
     return row.b1; 
    } 
} 
+0

@Alex:我認爲,這將意味着ORDER BY,必須在客戶端上進行處理,LINQ to SQL的將不能夠翻譯成SQL。 – Richard 2009-07-02 15:25:01

+0

@理查德:好點,我認爲你是對的。 – 2009-07-02 17:07:31

0

如何:

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;