2010-09-24 55 views
2

我有一個問題,試圖找出以下的LINQ查詢。LINQ條件分組

的列有MeterSerialNumber日期設備類型(M或C),然後48讀取值的列。

一些儀表將安裝校正器。對於這些儀表,同一日期將有M(DeviceType)行和C行。我需要這些儀表的C行。

例如

我需要一個查詢轉換這樣的:

MeterSerialNumber,Date,DeviceType,Reading1,Reading2,etc 
8017680S,19/08/2010,M,12,23,etc 
4504761S,19/08/2010,M,12,23,etc 
4504761S,19/08/2010,C,12,23,etc 
08000963,19/08/2010,M,12,23,etc 

要這樣:

MeterSerialNumber,Date,DeviceType,Reading1,Reading2,etc 
8017680S,19/08/2010,M,12,23,etc 
4504761S,19/08/2010,C,12,23,etc 
08000963,19/08/2010,M,12,23,etc 

我懷疑我可能需要嵌套查詢,但只是不能讓我的頭一輪吧!

+0

你有這個數據結構或者是它只是一個CSV文本文件? – 2010-09-24 11:53:24

+0

嗨Isak,我在上面的字段名稱與對象 – Dene 2010-09-24 12:05:48

回答

1

或者試試這個:

var group = meters 
    .Where(m => m.DeviceType == "M" && !meters.Any(m2 => m2.MeterSerialNumber == m.MeterSerialNumber && m2.DeviceType == "C")) 
    .Union(meters 
     .Where(m => m.DeviceType == "C" && meters.Any(m2 => m2.MeterSerialNumber == m.MeterSerialNumber && m2.DeviceType == "M"))); 
+0

非常感謝。它完美地通過了測試!現在要弄清楚它是如何工作的... – Dene 2010-09-24 12:20:52

+0

不客氣:) – danijels 2010-09-24 12:23:27

+0

我實際上必須添加另一個檢查日期。但我現在明白了。再次 - 非常感謝 – Dene 2010-09-24 12:24:53

1
var query = sourceData.GroupBy(
       x => new { x.MeterSerialNumber, x.Date }, 
       (k, g) => g.OrderBy(x => x.DeviceType == 'C' ? 0 : 1).First());