LINQ将多个字段分组并将非唯一字段放入列表中

时间:2017-04-13 10:30:48

标签: c# linq

我有一个对象列表,TargetList从数据库中填充,我希望根据AnalyteIDMethodIDInstrumentID字段将这些对象组合在一起,但是{ {1}}字段将存储在适用于每个分组对象的列表中。

此外,只有一个可用单元可以为其分配目标。因此,在分组过程中,我需要检查目标是否可用,如果是,则跳过创建单元列表。

Database extraction of targets

Unit对象包含以下属性:

TargetList

我有一个使用LINQ进行多分组的方法:

public int id { get; set; }
public int AnalyteID { get; set; }
public string AnalyteName { get; set; }
public int MethodID { get; set; }
public string MethodName { get; set; }
public int InstrumentID { get; set; }
public string InstrumentName { get; set; }
public int UnitID { get; set; }
public string UnitDescription { get; set; }
public decimal TargetMean { get; set; }
public List<Unit> Units { get; set; }

但如果目标不存在,在确定当前组中所有可用单位之前如何检查连续目标是不确定的。

1 个答案:

答案 0 :(得分:0)

我创建了一个解决方案,该解决方案根据AnalyteIDMethodIDInstrumentID对这些数据库返回的所有行进行分组(其中包含每个行的名称&#39;)在分组中)。

此外,仅当Unit为0时,所有非唯一UnitID属性(UnitDescriptionTargetMean)才会被放入列表中。

targetViewModel.TargetList                      
    // Group by unique analyte/method/instrument   
    .GroupBy(x => new { x.AnalyteID, x.AnalyteName, x.MethodID, x.MethodName, x.InstrumentID, x.InstrumentName }) 
        // Select all attributes and collect units together in a list                   
        .Select(g => new TargetView
        {
            id = g.Max(i => i.id),
            AnalyteID = g.Key.AnalyteID,
            AnalyteName = g.Key.AnalyteName,
            MethodID = g.Key.MethodID,
            MethodName = g.Key.MethodName,
            InstrumentID = g.Key.InstrumentID,  
            InstrumentName = g.Key.InstrumentName,
            TargetMean = g.Max(i => i.TargetMean),
            UnitID = g.Max(i => i.UnitID),
            UnitDescription = g.Max(i => i.UnitDescription),
            // only extract units when target mean is 0                   
            Units = g.Where(y => y.TargetMean == 0) 
                .Select(c => new Unit { ID = c.UnitID, Description = c.UnitDescription }).ToList() 
}).ToList();

注意:Max方法用于提取任何必需的非关键属性,例如TargetMean / id。这样可以正常工作,因为如果存在TargetMean,则只返回一行。

感觉很脏&#39;要使用Max方法以获取所有其他非关键属性,如果有人有任何其他建议,请随时删除答案/评论,因为我有兴趣看看是否有任何更清洁的方法达到同样的效果。