2010-09-24 87 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());