LINQ条件分组

时间:2010-09-24 11:45:54

标签: c# linq-to-objects

我在尝试找出以下的LINQ查询时遇到了问题。

列是 MeterSerialNumber 日期 DeviceType (M或C),然后是48个读数值列。

某些仪表将安装校正器。对于这些仪表,同一日期将有M(DeviceType)行和C行。我只需要这些米的C行。

e.g。

我需要一个查询来转换它:

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

我怀疑我可能需要嵌套查询,但却无法理解它!

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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")));