Announcement

Collapse
No announcement yet.

Linq über Filter exportieren

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

  • Linq über Filter exportieren

    Hallo, ich hab mal wieder eine vb6 to vb.net frage

    in meinem vb6 Programm habe ich eine globale Funktion um Recordsets über Filter(string,oder datei) zu exportieren.

    das ganze funktioniert ungefähr so.

    mein Recordset:

    Felder:{FeldZuname,FeldVorname,FeldStrasse,FeldGeb urtsdatum}
    Werte:{Müller, Hans, Musterweg 2,22.12.2012}

    wird in die Funktion gesteckt, zusätzlich mit einem FilterString.

    filter: "{FeldZuname}";"{FeldVorname}";"{FeldStrasse}[L,20]","{FeldGeburtsdatum}[ddmmyyy]"

    Jetzt schaut die Funktion was in den runden Klammen steht und schaut im recordset ob dieses Feld vorhanden ist rs.Fields(x).Name = "Feldzuname"
    wird das Feld gefunden kommt wird der String {Feldzuname} durch die Value ersetzt rs.fields(x).value
    Zusätzlich wird geschaut ob hinter der "}" eine Eckige Klammer "[" und die Formatierung berücksichtigt.

    Ergebnis: "Müller";"Hans";"Musterweg 2 (feste feldlänge 20 zeichen)";"22122012"

    Soweit dazu. Das funktioniert alles Prima und egal ob XML oder CSV Datei damit kann ich meine Filter bauen wie ich sie brauch und durchjagen.

    Mit Vb.Net arbeite ich fast ausschließlich mit Linq und den Devexpresstools, wo ich scheinbar wieder an die Grenzen von Linq gestoßen bin.

    wenn ich meine Linq Abfrage baue
    Code:
    dim liste = (from x in db.Kunde).tolist
    kann ich später in meiner Filterübersetzen Prozedure ja leider nicht auf die einzelnen Felder abfragen geschweige denn die Value rausbekommen.

    Beispiel liste[SpaltenName].[ZeilenNummer] oder so ...

    Wie könnt ich da vorgehen ?
    Oder muss ich wieder ganz umdenken in .Net und es gibt einen ganz anderen Ansatz mir beliebige Filter "übersetzen" zu lassen.

    Danke schon mal vorab

  • #2
    Ich antworte mir Teilweise mal wieder selbst:

    Also ich hab es auf eine Art und Weise hinbekommen, die ich selbst nicht wirklich verstehe.
    Ich habe ein Beispiel gefunden wie man ein Duplikat eines Linq Typs macht um zb einen Datensatz zu kopieren. Das konnte ich soweit umbauen das mein "Filterübersetzer" jetzt teilweise funktioniert.

    Hier mal ein Code Schnipsel :
    [highlight=vbnet]
    Dim db As New dbMeinDataContext
    Dim sColumnName As String = ""
    Dim sFeldValue As String = ""
    Dim dataMembers As IEnumerable(Of Data.Linq.Mapping.MetaDataMember) = From mem In db.Mapping.GetTable(myRow.[GetType]()).RowType.DataMembers Where mem.IsAssociation = False
    For Each mem As Data.Linq.Mapping.MetaDataMember In dataMembers
    sColumnName = mem.Name
    Dim Value As Object = mem.StorageAccessor.GetBoxedValue(myRow)

    If Not IsNothing(Value) Then
    sFeldValue = Value.ToString
    Debug.Print(sColumnName & ": " & sFeldValue)
    ....

    [/highlight]

    MyRow ist im funktionierenden Fall jetzt vom Typ Artikel
    [highlight=vbnet]dim myrow = (from x in db.Artikel where x.id=2).tolist[/highlight]


    Im nichtfunktionierenden Fall übergebe ich ein Join, das dann wohl zu keinem Typ der Datamember oder so passt (ich weiß es nicht...)


    [highlight=vbnet]dim myrow = (from x in db.Artikel join y in db.ArtikelPreis on x.id Equals y.fi where x.id=2).tolist[/highlight]

    Der Fehler folgende kommt dann in dieser Zeile:
    [highlight=vbnet]Dim dataMembers As IEnumerable(Of Data.Linq.Mapping.MetaDataMember) = From mem In db.Mapping.GetTable(myRow.[GetType]()).RowType.DataMembers Where mem.IsAssociation = False[/highlight]


    Fehler: NullReferenceException wurde nicht von Benutzercode behandelt. Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.

    fehlt mir nur irgendwo ein "new" oder sowas ?

    Comment

    Working...
    X