2017-07-17 85 views
0

我有一些LINQ查詢執行以下操作:LINQ的添加缺少的不同值

... 
CarsCategories = new ObservableCollection<CarsCategory>(y 
             .GroupBy(x1 => new { a = x1.Field<string>("CategoryName") }) 
             .Select(z => new CarCategory 
             { 
              CategoryName = z.Key.a, 
              CarGroups = new ObservableCollection<CarGroup>(z 
               .GroupBy(x1 => new { a = x1.Field<string>("GroupName") }) 
               .Select(z1 => new CarGroup 
                { 
                 GroupName = z1.Key.a, 
                 CarTests = new ObservableCollection<CarTest>(z1 
                  .GroupBy(x2 => new { a = x2.Field<string>("TestName") }) 
                  .Select(z2 => new CarTest 
                  { 
                   TestName = z2.Key.a, 
                   CarTestNumbers = new ObservableCollection<CarTestNumber>(z2 
                    .Select(z3 => new CarTestNumber 
                    { 
                     TestNumber = z3.Field<String>("TestNumber"), 
                     TestVisitCode = z3.Field<String>("TestVisitCode") 
                    })) 

                  })) 
                } 

             ))})) 
... 

基本上我有這是由CarCategory分組一張大桌子,然後CarGroup,然後CarTest每個CarTest有多個TestNumber和TestVisitCode參數。

一切工作正常,但我想做到以下幾點:

所有這個表裏面測試有不同TestVisitCode值。我希望對於我的分組類別CarTestNumbers中的每個測試,要在表格中顯示所有不同的TestVisitCode,並且在其中顯示值,否則顯示空字符串。

CarTestNumber模式是這樣的:

public class CarTestNumber 
    { 
     public string TestNumber { get; set; } 

     public string TestVisitCode { get; set; } 

     public string VisitCodeAndTestNumber 
     { 
      get { return TestVisitCode +" - " + TestNumber; } 
     } 

    } 

現在我只顯示現有TestVisitCodeTestNumber

例如:

Row1: CategoryName - FirstCategory GroupName - FirstGroup TestName - "FirstTest" TestNumber - "12" TestVisitCode - "W1" 
Row2: CategoryName - FirstCategory GroupName - FirstGroup TestName - "FirstTest" TestNumber - "13" TestVisitCode - "W2" 
Row3: CategoryName - FirstCategory GroupName - FirstGroup TestName - "SecondTest" TestNumber - "14" TestVisitCode - "W1" 
Row4: CategoryName - FirstCategory GroupName - FirstGroup TestName - "SecondTest" TestNumber - "15" TestVisitCode - "W2" 
Row5: CategoryName - FirstCategory GroupName - FirstGroup TestName - "SecondTest" TestNumber - "16" TestVisitCode - "W3" 

After executing linq the data will look like this 

FirstCategory 
    FirstGroup 
     FirstTest - {(W1,12), (W2,13)} 
     SecondTest - {(W1,14), (W2,15),(W3, 16)} 

What I would like to have 

FirstCategory 
    FirstGroup 
     FirstTest - {(W1,12), (W2,13),(W3, "")} 
     SecondTest - {(W1,14), (W2,15),(W3, 16)} 
+1

第一:你試圖做什麼?第二:耶穌全能的基督,解決你的財產名稱。 –

+0

嗨。首先:你可以在例子中看到我正在嘗試做什麼。第二:我會的。 –

回答

1

可以先選中所有TestVisitCodes。 在您的linq查詢中,您可以與所有此訪問代碼進行聯合,這些聯合代碼不在您當前的CarTestNumber中。 這有點令人困惑。

我創建了一個DataTable並填寫與您TESTDATA:

DataTable loDt = new DataTable(); 
loDt.Columns.Add("CategoryName", typeof(string)); 
loDt.Columns.Add("GroupName", typeof(string)); 
loDt.Columns.Add("TestName", typeof(string)); 
loDt.Columns.Add("TestNumber", typeof(string)); 
loDt.Columns.Add("TestVisitCode", typeof(string)); 

var loRow = loDt.NewRow(); 
loRow["CategoryName"] = "FirstCategory"; 
loRow["GroupName"] = "FirstGroup"; 
loRow["TestName"] = "FirstTest"; 
loRow["TestNumber"] = "12"; 
loRow["TestVisitCode"] = "W1"; 
loDt.Rows.Add(loRow); 

loRow = loDt.NewRow(); 
loRow["CategoryName"] = "FirstCategory"; 
loRow["GroupName"] = "FirstGroup"; 
loRow["TestName"] = "FirstTest"; 
loRow["TestNumber"] = "13"; 
loRow["TestVisitCode"] = "W2"; 
loDt.Rows.Add(loRow); 

...  

然後我就與所有TestVisitCodes列表:

var loTestVisitCodes = loDt.AsEnumerable().Select(item => item.Field<string>("TestVisitCode")).Distinct(); 

最後這裏的LINQ查詢(看工會聲明):

var loCarsCategories = loDt.AsEnumerable() 
    .GroupBy(row => new { CategoryName = row.Field<string>("CategoryName") }) 
    .Select(catGroup => new CarCategory 
    { 
     CategoryName = catGroup.Key.CategoryName, 
     CarGroups = new List<CarGroup>(catGroup 
      .GroupBy(row => new { GroupName = row.Field<string>("GroupName") }) 
      .Select(groupGroup => new CarGroup 
      { 
       GroupName = groupGroup.Key.GroupName, 
       CarTests = new List<CarTest>(groupGroup 
        .GroupBy(row => new { TestName = row.Field<string>("TestName") }) 
        .Select(groupTest => new CarTest 
        { 
         TestName = groupTest.Key.TestName, 
         CarTestNumbers = new List<CarTestNumber>(groupTest 
          .Select(row => new CarTestNumber 
          { 
           TestNumber = row.Field<String>("TestNumber"), 
           TestVisitCode = row.Field<String>("TestVisitCode") 
          }) 
          .Union(new List<CarTestNumber>(loTestVisitCodes 
           .Except(groupTest.Select(row => row.Field<string>("TestVisitCode"))) 
           .Select(VisitCode => new CarTestNumber 
           { 
            TestNumber = string.Empty, 
            TestVisitCode = VisitCode 
           })))) 
        })) 
      })) 
    }); 
+0

謝謝。我不知道你可以做這樣的事情。我也修改了名稱以使其更清晰。真的很好的答案。 –