2013-04-12 34 views
1

我使用LINQPad來評估我的linq查詢。我的查詢是這樣的:
使用LINQ從多列多​​行獲取最大值?

from o in MyTableFirst 
join p in MyTableSecond on o.TheName equals p.TheName 
where p.TheName == "CBA-123" && !p.Removed && 
    (o.ReturnPeriod ==100 || o.ReturnPeriod ==10) 
select new { 
    HMax1 = o.MaxValue1, 
    HMax2 = o.MaxValue2, 
    HMax3 = o.MaxValue3 
} 


這種查詢可以返回0或一些的行數。

在LINQPad,這回我是這樣的:

HMax1       HMax2       HMax3
21.1                                   22.5
                  24.6                 11.5

現在,我將如何獲得這些返回行&列的最大值?
我期待回報24.6

謝謝

+0

'MyTableFirst'是什麼樣的?以及「o.MaxValue1」的類型是什麼? –

+0

「CREATE TABLE [DBO]。[MyTableFirst]( \t [ID] [INT] IDENTITY(1,1)NOT NULL, \t [TheName] [nvarchar的](50)COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, \t [ReturnPeriod] [SMALLINT] NULL, \t [MaxValue1] [浮子] NULL, \t [MaxValue2] [浮子] NULL, \t [MaxValue3] [浮子] NULL )ON [PRIMARY]' – mADy1270

+0

CREATE TABLE [DBO]。[MyTableSecond]( \t [ID] [INT] IDENTITY(1,1)NOT NULL, \t [TheName] [nvarchar的](50)COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, \t [刪除] [比特] NOT NULL )ON [PRIMARY] – mADy1270

回答

2

如何:

或.OrderByDescending代替
(from o in db.MyTableFirsts 
join p in db.MyTableSeconds on o.TheName equals p.TheName 
where p.TheName == "CBA-123" && !p.Removed && 
(o.ReturnPeriod == 100 || o.ReturnPeriod == 10) 
    select new 
    { 
    Maximum = Math.Max(
     Math.Max((float)(o.MaxValue1 ?? 0), (float)(o.MaxValue2 ?? 0)), 
     (float)(o.MaxValue3 ?? 0) 
    ) 
    }).OrderByDescending(o => o.Maximum).FirstOrDefault(); 

(O => o.Maximum).FirstOrDefault(),您可以使用.Max(o => o)

+0

謝謝。查詢成功。但沒有結果返回.... – mADy1270

+0

是因爲某些字段有* null *值 – mADy1270

+0

我們將每個空值更改爲0(o.HMax3 ?? 0),所以不應該是問題。據我所見,沒有結果的唯一原因應該是因爲查詢不會生成任何記錄。你應該嘗試改變選擇部分,如下所示: select new {Val = o.HMax1})。ToList(),看看你的查詢是否返回任何東西。另外,請注意,我沒有在linqpad中測試這個。我只寫了一個控制檯應用程序來測試查詢。 –

1

試試這個:

(
from o in MyTableFirst 
join p in MyTableSecond on o.TheName equals p.TheName 
where p.TheName == "CBA-123" && !p.Removed && 
(o.Level ==100 || o.Level ==10) 

//combine all of the numbers into one list 
let listOfNumbers = new List<double?>{o.MaxValue1,o.MaxValue2,o.MaxValue3} 

//select the list 
select listOfNumbers 
) 
.SelectMany(c => c) //combine all the lists into one big list 
.Max(c => c) //take the highst number 
+0

嘗試在LINQPad上運行這個查詢,它給了我這個信息: * NotSupportedException:無參數集合運算符'Max'不支持超過投影。* – mADy1270

+0

@ mADy1270礦井工作正常(也在LinqPad中) - 確保您擁有所有括號正確設置。編輯我的答案,使其更清晰 –

+0

我複製並粘貼了我的LINQPad上的所有內容。仍然給我同樣的信息。我正在使用LINQPad 4.43.06。 – mADy1270