2017-04-13 115 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方法爲了獲得所有其他非關鍵屬性確實覺得「髒」,但如果任何人有任何其他建議,請隨時放棄一個答案/評論,因爲我有興趣看看是否有更清晰的方法可以達到相同的結果。