我有一个对象列表,该对象是我想根据TargetList
,AnalyteID
和MethodID
字段分组在一起的数据库中的InstrumentID
,但是Unit
字段将存储在适用于每个分组的对象。
此外,仅可能为一个可用单元分配一个目标。因此,在分组期间,我需要检查目标是否可用,如果可以,请跳过创建单位列表的操作。TargetList
对象包含以下属性:
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; }
我有一种使用LINQ进行多重分组的方法:
TargetList.GroupBy(x => new { x.AnalyteID, x.MethodID, x.InstrumentID })...
但是不确定在不存在目标的情况下如何在提取当前组的所有可用单元之前连续检查目标。
最佳答案
我创建了一个解决方案,该解决方案基于AnalyteID
,MethodID
和InstrumentID
将数据库返回的所有行分组(分组中还包括了每个行的“名称”)。
此外,仅当Unit
为0时,所有非唯一的UnitID
属性(UnitDescription
和TargetMean
)才会放入列表中。
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
,则仅返回一行。为了获得所有其他非关键属性,使用
Max
方法确实感到“肮脏”,因此,如果有人有其他建议,请随时删除答案/评论,因为我有兴趣查看是否有任何更清洁的方法来达到相同的结果。关于c# - LINQ将多个字段分组并将非唯一字段放入列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43389875/