2017-07-17 12 views
0

ich einige Linq-Abfrage haben, die die folgenden:Linq verschiedene Werte Fehlende

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

                  })) 
                } 

             ))})) 
... 

Im Prinzip habe ich eine große Tabelle, die von CarCategory gruppiert ist, und dann durch Fahrzeuggruppe und dann durch CarTest und jeder CarTest hat mehrere TestNumber- und TestVisitCode-Parameter.

Alles funktioniert wie erwartet, aber ich möchte folgendes tun:

Alle Tests innerhalb dieser Tabelle haben unterschiedliche TestVisitCode Werte. Ich möchte das für jeden Test innerhalb meiner gruppierten Kategorie CarTestNumbers, um alle unterschiedlichen TestVisitCode in der Tabelle vorhanden zu haben, und wo ich einen Wert habe, um es zu zeigen, zeigen Sie andernfalls eine leere Zeichenkette an.

Mein CarTestNumber Modell sieht wie folgt aus:

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

     public string TestVisitCode { get; set; } 

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

    } 

Denn jetzt zeige ich nur TestVisitCode und TestNumber vorhanden.

Zum Beispiel:

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

Erstens: Was haben Sie versucht zu tun? Zweitens: Jesus, allmächtiger Christus, löse deine Eigentumsnamen. –

+0

Hallo. Erstens: Sie können im Beispiel sehen, was ich versuche zu tun. Zweitens: Ich werde es tun. –

Antwort

1

Sie können zunächst alle TestVisitCodes wählen. In Ihrer LINQ-Abfrage können Sie eine Union mit all diesen VisitCodes erstellen, die nicht in Ihrem aktuellen CarTestNumber sind. Es ist ein bisschen verwirrend.

erstelle ich ein DataTable und fülle das mit Ihren Testdaten:

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); 

...  

Dann mache ich eine Liste mit allen TestVisitCodes:

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

Und schließlich ist hier die Linq-Abfrage (Blick auf der Union Anweisung):

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

Danke. Ich hatte keine Ahnung, dass du solche Dinge tun könntest. Ich habe auch die Namen geändert, um es klarer zu machen. Wirklich nette Antwort. –

Verwandte Themen