Announcement

Collapse
No announcement yet.

Linq To DataSet (Distinct - Methode)

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Linq To DataSet (Distinct - Methode)

    Guten Tag Zusammen,

    momentan befasse ich mich mit LINQ to DataSets. Dabei bin ich auf ein Problem mit der Methode DISTINCT gestoßen. Per DISTINCT sollten eigentlich Dublikate aus einer Datenmenge gefiltert werden. Leider war das Resultat nicht das was ich erwartet hatte.

    Ich arbeite mit einem typisieren DataSet. Das Feld UnitParam kann folgendes enthalten.

    UnitParam:
    FlowUnit
    PressureUnit
    FlowUnit
    LevelUnit
    HeightUnit
    PressureUnit
    TankContentUnit
    TankContentUnit
    TankContentUnit
    CurrentUnit
    CurrentUnit
    LevelUnit
    ...


    Mein Code sieht folgendermassen aus:

    Beispiel 1:
    var unit1 = (from u in dsData.Unit
    where !u.IsNull("UnitParam")
    select u.UnitParam).Distinct();

    dataGridView1.DataSource = unit1.ToList();

    Beispiel 2:
    var unit2 = dsData.Unit
    .SelectMany(u => u.UnitParam)
    .Distinct();

    dataGridView1.DataSource = unit2.ToList();

    In der Ergebnismenge wird bei beiden Möglichkeiten folgendes dargestellt.

    Length:
    5
    4
    4
    5
    ...

    Ich hätte hier die Erwartung das nicht die Länge,
    sondern das UnitParam ausgegeben würde.

    Viele Grüsse

    Markus

  • #2
    Hallo,

    da mir der Aufbau deines DataSet unbekannt ist kann ich nur Tippen:

    Probier mal:
    Code:
    var unit1 =
        (from u in dsData.Unit.UnitParam
         where !string.IsNullOrEmpty(u)
         select u)
        .Distinct();
    
    var unit2 = dsData.Unit.UnitParam
        .Where(u => !string.IsNullOrEmpty(u))
        .Distinct();
    Hoffe es hilft dir.

    mfG Gü
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

    Comment


    • #3
      Hallo ,

      leider war das nicht die Lösung meines Problems.

      Bei der Abfrage

      var unit1 =
      (from u in dsData.Unit.UnitParam
      where !string.IsNullOrEmpty(u.UnitParam)
      select u)
      .Distinct();

      wird folgende Exception ausgelöst:


      "DeviceData.UnitDataTable" enthält keine Definition für "UnitParam",
      und es konnte keine Erweiterungsmethode "UnitParam" gefunden werden,
      die ein erstes Argument vom Typ "DeviceData.UnitDataTable" akzeptiert.
      (Fehlt eine Using-Direktive oder ein Assemblyverweis?)

      Oder müsste das über DataColumn dsData.Unit.UnitParamColumn gelösen werden?

      Nun wie sieht den meine Tabellen Struktur aus. Die Struktur wird aus einer XSD - Datei entnommen:

      Tabellen Struktur (kleiner Ausschnitt der XSD-Datei):

      <xs:element minOccurs="0" name="Unit">
      <xs:complexType>
      <xs:sequence>
      <xs:element minOccurs="0" name="UnitParam" type="xs:string" />
      <xs:element minOccurs="0" name="UnitValue">
      <xs:complexType>
      <xs:simpleContent>
      <xs:extension base="xs:string">
      <xs:attribute name="StaticInstance" type="xs:unsignedByte" use="required" />
      <xs:attribute name="TextName" type="xs:string" use="required" />
      <xs:attribute name="Code" type="xs:string" use="required" />
      <xs:attribute name="InternalCode" type="xs:string" use="required" />
      </xs:extension>
      </xs:simpleContent>
      </xs:complexType>
      </xs:element>
      </xs:sequence>
      <xs:attribute name="BaseUnitCode" type="xs:string" use="required" />
      <xs:attribute name="InternalBaseUnitCode" type="xs:string" use="required" />
      <xs:attribute name="BaseUnitTextName" type="xs:string" use="required" />
      </xs:complexType>
      </xs:element>

      Die Tabelle sieht etwa so aus:

      Tabelle Name = Unit
      Tabellen Felder = BaseUnitCode, InternalBaseUnitCode, BaseUnitTextName & UnitParam

      Tabelle Daten:
      --------------------------------------------------------------------------------------------------
      BaseUnitCode | InternalBaseUnitCode | BaseUnitTextName | UnitParam
      --------------------------------------------------------------------------------------------------
      51 | 1054 | sec | SecondUnit
      not defined | not defined | Pa | Pressure1Unit
      not defined | not defined | not defined |
      not defined | not defined | not defined |
      not defined | not defined | not defined |
      48 | 1012 | easy_percent | LevelUnit
      48 | 1012 | easy_percent | LevelUnit
      48 | 1012 | easy_percent | LevelUnit
      ... | ... | ... | ...

      Vielleicht noch als Hinweis. Das typisierte DataSet erstelle ich mir über das XSD.exe Tool.

      xsd.exe /dataset /eld /lanuage:CS xyz.xsd

      Gruss

      Markus

      Comment

      Working...
      X