2017-04-13 56 views
2

我有对象的列表,从中我想在一起基础上AnalyteIDMethodIDInstrumentID领域组数据库填充TargetList,但Unit领域将被保存在适用于每个分组对象的列表中。LINQ分组多个字段,并把非唯一的领域进入名单

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

Database extraction of targets

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 })... 

但不确定如何检查如果目标不存在,则在提取当前组中的所有可用单元之前的行中的目标。

+0

分组效果很好,预计数据将是'Target'类型,但是您需要发布什么内容,如果需要,您可以使用'SelectMany'来展平'Units' –

+0

我无法很好地理解您的意思。什么是'目标'。一行意味着'目标'? – sinanakyazici

+0

返回的每一行实际上都是一个“目标”对象。任何具有分配的TargetMean的Target都只返回一行(因为只有一个单位可以分配给Target),但是如果没有TargetMean可用,SP返回的行数与UnitID一样多对于分析物/方法/仪器组合,因此我需要对返回的行进行分组,并将所有可用单位(对于没有TargetMean的每个目标组合)进行分组,并将它们放入列表中,希望这是一个小例子更清晰 – Sandman

回答

0

我创建所述基团的所有行从数据库基于所述AnalyteIDMethodIDInstrumentID(的每个的这些都包含在分组藏汉“名称”)返回的溶液。

此外,所有非唯一Unit属性(UnitIDUnitDescription)被放置成一个列表仅当TargetMean为0

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方法为了获得所有其他非关键属性确实觉得“脏”,但如果任何人有任何其他建议,请随时放弃一个答案/评论,因为我有兴趣看看是否有更清晰的方法可以达到相同的结果。