2011-04-21 98 views
2

我知道我可以使用.Min()從列中獲取最小值,但是如何在行中獲取最小值?在LINQ查詢過程中獲取行中的最小值

我有以下LINQ查詢(用於測試目的):

from p in Pravidloes 
where p.DulezitostId == 3 
where p.ZpozdeniId == 1 || p.ZpozdeniId == 2 
where p.SpolehlivostId == 2 || p.SpolehlivostId == 3 

group p by p.VysledekId into g 
select new { 
    result = g.Key, 
    value = g 
} 

導致成這樣:
linqqueryimage http://i52.tinypic.com/qq92bq.png

我卻想只得到以下三個最小值列:
DulezitostId,ZpozdeniId,SpolehlivostId作爲值:

select new { 
    result = g.Key, 
    value = g // <-- here 
} 

最終的結果則應該像:
結果:2,值:1
結果:3,值:2

我一直在這裏尋找類似的問題,並用Google搜索一些例子通過對查詢進行分組和聚合,但沒有發現任何會使我前進的問題。

順便說一句:解決方案不限於linq,如果你知道更好的方式如何做到這一點。

+0

在這裏不是很多捷克人,很高興看到另一個捷克人。 – svick 2011-04-21 17:39:23

+0

嗨..的確如此。順便說一句:謝謝你的幫助;) – Damb 2011-04-21 18:28:23

回答

3

你可以創建一個數組的數組,並對這些數值做Min。

select new { 
    result = g.Key, 
    value = g.SelectMany(x => new int[] { x.DulezitostId, x.ZpozdeniId, x.SpolehlivostId }).Min() 
} 

這將返回分鐘在每個這些3個值用於該分組的所有行分組。

這會導致這樣的事情...

結果:3,值:1

下面將選擇分鐘在編組的每一行...

select new { 
    result = g.Key, 
    value = g.Select(x => new int[] { x.DulezitostId, x.ZpozdeniId, x.SpolehlivostId }.Min()) 
} 

這會導致這樣的事情...

結果:3,值:1,2

+0

謝謝!我試圖這樣做,但不知道正確的語法。無論如何..我得到這個錯誤:'只有Contains支持構造數組。' – Damb 2011-04-21 17:28:50

+0

@Dampe:LINQ to SQL不知道如何將該查詢轉換爲SQL。在選擇之前調用零件上的'AsEnumerable()',然後可以選擇內存中的結果。 – svick 2011-04-21 17:42:53

+0

@Dampe看到我的答案 - 如果您使用Linq To Sql,則可以使用Math.Min而不是 – 2011-04-21 17:42:54

2

如果您使用直線LINQ,最佳解決方案是Chad's answer。但是,如果你使用Linq To SQL,它將無法工作,因爲你不能像這樣構建一個數組。

不幸的是,我相信在LINQ to做到這一點To Sql的唯一的辦法就是反覆使用Math.Min:

select new { 
    result = g.Key, 
    value = Math.Min(Math.Min(DulezitostId, ZpozdeniId), SpolehlivostId) 
} 

這會產生一些醜陋的CASE WHEN ...語句,但它的工作原理。

這樣做的主要優點是您只需從SQL返回所需的數據(而不是返回所有3列並在應用程序中執行Min)。

+0

+1,謝謝你的輸入。這也是一個有價值的答案,但我決定爲我的案例使用第一個解決方案。 (不幸的是不能標記兩個答案:)) – Damb 2011-04-21 18:27:27

+0

@Dampe另一個答案是更好的代碼,但請注意,如果您選擇了很多行,在內存中執行MIN而不是SQL,則需要跨越3倍的數據來自DB的網絡。 – 2011-04-21 18:29:08

+0

現在,我得到正好4行。而且,將來我不會超過10個,所以應該沒問題。 – Damb 2011-04-21 18:33:08

相關問題