2017-07-17 36 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

谢谢。我不知道你可以做这样的事情。我也修改了名称以使其更清晰。真的很好的答案。 –