我有一个对象列表,TargetList
从数据库中填充,我希望根据AnalyteID
,MethodID
和InstrumentID
字段将这些对象组合在一起,但是{ {1}}字段将存储在适用于每个分组对象的列表中。
此外,只有一个可用单元可以为其分配目标。因此,在分组过程中,我需要检查目标是否可用,如果是,则跳过创建单元列表。
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; }
但如果目标不存在,在确定当前组中所有可用单位之前如何检查连续目标是不确定的。
答案 0 :(得分:0)
我创建了一个解决方案,该解决方案根据AnalyteID
,MethodID
和InstrumentID
对这些数据库返回的所有行进行分组(其中包含每个行的名称&#39;)在分组中)。
此外,仅当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
,则只返回一行。
感觉很脏&#39;要使用Max
方法以获取所有其他非关键属性,如果有人有任何其他建议,请随时删除答案/评论,因为我有兴趣看看是否有任何更清洁的方法达到同样的效果。