LINQ mit Bedingung aus Variable

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von kurzda.

    LINQ mit Bedingung aus Variable

    Guten Morgen,

    sagt mal ich wie kann ich in einem LINQ-Statement den Operater und die Bedingung aus einer Variable auslesen/verwenden?
    Meine Daten zeigen eine Auflistung von Artikeln mit deren Lagerbeständen, etc... an.

    Mein Ziel ist, dass der Benutzer die Abfrage beeinflussen kann, ab wann der Artikel verfügbar ist.
    Beispiele: > 0 oder >= 0 oder > 1 oder ...

    Genau diese Konstellationen wollte ich mit einer systemübergreifenden Variable festlegen, also in der INI-Datei speichern und entsprechend bei der LINQ-Abfrage ansteuern.

    Durch Googlen kam der Tipp mit LET, aber funktioniert genauso wenig, als wenn ich die Bedingung selber in die IF-Clause schreibe.

    Quellcode

    1. Dim AnzeigeVormerkungen = From VM In Kontext.Vormerkungen
    2. Let Verfügbar = (VM.ArtikelObjekt.VFG & Variablen.VerfuegbarkeitOperator & Variablen.VerfuegbarkeitMenge)
    3. Select VM.ArtikelObjekt.ARTANR, VM.ArtikelObjekt.OE, VM.ArtikelObjekt.EAN, VM.Aufgabe, Vollständig = If(Verfügbar, "Ja", "Nein"),
    4. VM.Prio, VM.ArtikelObjekt.BildDatum, Hinweis = ""


    Erhalte dabei aber folgende Fehlermeldung:

    Quellcode

    1. A valid ResultType could not be inferred from the ResultTypes of the specified 'Then' expressions.
    2. bei System.Data.Entity.Core.Common.CommandTrees.ExpressionBuilder.Internal.ArgumentValidation.ValidateCase(IEnumerable`1 whenExpressions, IEnumerable`1 thenExpressions, DbExpression elseExpression, DbExpressionList& validWhens, DbExpressionList& validThens)
    3. bei System.Data.Entity.Core.Common.CommandTrees.ExpressionBuilder.DbExpressionBuilder.Case(IEnumerable`1 whenExpressions, IEnumerable`1 thenExpressions, DbExpression elseExpression)
    4. bei System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.CoalesceTranslator.TranslateBinary(ExpressionConverter parent, DbExpression left, DbExpression right, BinaryExpression linq)
    5. bei System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.BinaryTranslator.TypedTranslate(ExpressionConverter parent, BinaryExpression linq)
    6. bei System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq)
    7. bei System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq)
    8. bei System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.StringConcatTranslator.Translate(ExpressionConverter parent, MethodCallExpression call)
    9. bei System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter parent, MethodCallExpression linq)
    10. bei System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq)
    11. bei System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq)
    12. bei System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.UnaryTranslator.TypedTranslate(ExpressionConverter parent, UnaryExpression linq)
    13. bei System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq)
    14. bei System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq)
    15. bei System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.ConditionalTranslator.TypedTranslate(ExpressionConverter parent, ConditionalExpression linq)
    16. bei System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq)
    17. bei System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq)
    18. bei System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.NewTranslator.TypedTranslate(ExpressionConverter parent, NewExpression linq)
    19. bei System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq)
    20. bei System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq)
    21. bei System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateLambda(LambdaExpression lambda, DbExpression input)
    22. bei System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateLambda(LambdaExpression lambda, DbExpression input, DbExpressionBinding& binding)
    23. bei System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator.Translate(ExpressionConverter parent, MethodCallExpression call, DbExpression& source, DbExpressionBinding& sourceBinding, DbExpression& lambda)
    24. bei System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.SelectTranslator.Translate(ExpressionConverter parent, MethodCallExpression call)
    25. bei System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.SequenceMethodTranslator.Translate(ExpressionConverter parent, MethodCallExpression call, SequenceMethod sequenceMethod)
    26. bei System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter parent, MethodCallExpression linq)
    27. bei System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq)
    28. bei System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq)
    29. bei System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.Convert()
    30. bei System.Data.Entity.Core.Objects.ELinq.ELinqQueryState.GetExecutionPlan(Nullable`1 forMergeOption)
    31. bei System.Data.Entity.Core.Objects.ObjectQuery`1.<>c__DisplayClassb.<GetResults>b__a()
    32. bei System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction[T](Func`1 func, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction, Boolean releaseConnectionOnSuccess)
    33. bei System.Data.Entity.Core.Objects.ObjectQuery`1.<>c__DisplayClassb.<GetResults>b__9()
    34. bei System.Data.Entity.Infrastructure.DefaultExecutionStrategy.Execute[TResult](Func`1 operation)
    35. bei System.Data.Entity.Core.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption)
    36. bei System.Data.Entity.Core.Objects.ObjectQuery`1.<System.Collections.Generic.IEnumerable<T>.GetEnumerator>b__0()
    37. bei System.Lazy`1.CreateValue()
    38. bei System.Lazy`1.LazyInitValue()
    39. bei System.Lazy`1.get_Value()
    40. bei System.Data.Entity.Internal.LazyEnumerator`1.MoveNext()
    41. bei System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
    42. bei System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
    Hallo

    Mir würde hier spontan die Dynamic LINQ Library einfallen.

    Wie es aussieht Arbeitest du aber mit Entity Framework Core. Und das kann auch ein Resultset aus einem SQL Query in Entitäten abbilden.
    Warum also in diesem Fall nicht den SQL generieren und dann mit den Entitäten weiterarbeiten?

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Ich kann dir ja gerne Tipps geben, vorraussetzung ist mal das du uns die Info gibst welches EF du verwendest.

    Ich denke ja EF Core nicht EF 6 aber hier wäre interessant welche Version.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    OK, EF 6 ist nicht so dolle was dieses Feature betrifft, sollte aber für das was du brauchst ausreichen.
    Guck mal da.

    So solltest du genau die Abfrage zusammenstöpseln können wie du es benötigst.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Bitte drücke dich etwas verständlicher aus.

    kurzda schrieb:

    So wie ich das gelesen haben, geht das nur in Kombi mit der Version, aber ich schaue mal.

    Was geht in welcher Kombination mit welcher Version von was?
    Bitte denke immer daran das der gegenüber wissen muss was du meinst.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Ah,ok. Jetzt weis ich was du meintest.

    Btw: Haste was falsches gelernt.
    Schau: docs.microsoft.com/en-us/ef/core/providers/index

    Edit: EF Core geht auch mit VS 2015.
    Steht gleich zweiten Absatz.
    docs.microsoft.com/en-us/ef/core/get-started/install/
    Aber egal, das solltest du in EF 6 auch hinbekommen.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Nofear23m“ ()

    Ja Danke, eigentlich weiß ich ja man sollte nicht kryptisch sprechen. Manchmal tippt man schneller als man denkt :D

    Ich verfolge das nicht weiter, weil es mir zu umständlich für den Nutzen ist. Ich gebe statisch den Operator >= vor und der Benutzer hat die Möglichkeit die Zahl zu bestimmen.

    Muss mich eher mit einem Code jetzt nach der Umstellung auf EF6 kümmern, der vorher funktionierte und jetzt nicht mehr. Die Filterung der BindingSource klappt nicht mehr, aber das hat hier nichts zu suchen.
    Hmm - wie passt das zusammen?

    kurzda schrieb:

    ...eigentlich weiß ich ja man sollte nicht kryptisch sprechen...
    und:
    ...Ich gebe statisch den Operator >= vor und der Benutzer hat die Möglichkeit die Zahl zu bestimmen. ..
    Was ist "Operator vorgeben", >= Operator von was?, was fürne Zahl zu bestimmen?
    8|

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Hehe @ErfinderDesRades
    Verstehe was Du meinst, aber an für sich ist das nicht kryptisch, vielleicht ohne Kontext, aber nicht kryptisch.

    Anforderung: Artikelbestand >= x

    Meine Frage bezog sich auf der Operator ">=" und die unbekannte "x". Der Benutzer sollte bestimmen, ab wann ein Artikel als verfügbar gilt.
    Ich wollte eben, dass beides aus einer Ini-Datei gelesen wird und auch berücksichtigt wird. Da das aber doch mehr Umbauten bedeuten würde, habe ich mich dafür entschieden, dem Benutzer nur noch die Unbekannte bestimmen zu lassen. Den Operator gebe ich vor.