c# - tutorial - linq to objects




Wie erstellt man eine LINQ-Abfrage aus einer Zeichenfolge? (4)

Ich bin neu bei LINQ und brauche wirklich Hilfe bei der Programmierung.

Im Moment habe ich eine Zeichenfolge und eine Var-Variablen.

string temp = "from product in myEntities.Products where product.Name.Contains(_Name) select product";
var _Products = temp;
LvProducts.DataSource = _Products;
LvProducts.DataBind();

Grundsätzlich möchte ich in der Lage sein, eine benutzerdefinierte / komplizierte LINQ-Abfrage zu erstellen, indem Sie sie vorher einer Zeichenfolge zuweisen. Nach dem Komponieren ordne ich die Zeichenfolge der var-Variablen zu. Dies wird jedoch offensichtlich nicht funktionieren. Kann mir deshalb jemand dabei helfen?


Der Hauptgrund, warum Sie LINQ in erster Linie verwenden, ist, Compiler-verifizierte Abfragen zu erhalten, die Fehler zur Kompilierzeit erkennen. Dies wird diesen Zweck zunichte machen, da der String zur Laufzeit geparst wird.

Für Ihre Bedürfnisse haben Sie zwei Möglichkeiten:

1) Erstellen Sie eine eSQL-Abfrage und führen Sie sie auf dem ObjectContext aus. Auf diese Weise können Sie weiterhin Ihre Entitäten wie myEntities.Products verwenden und eine Liste von Produkten zurückgeben.

2) Verwenden Sie eine normale SQL-Abfrage und verwenden Sie den ObjectContext, um das direkt zur zugrunde liegenden Datenbank aufzurufen.


Meine Vermutung ist, dass Sie die dynamische Codeausführung verwenden müssen. Für weitere Details, sieh dir Ricks Post auf Westwind an .


Sie haben ein paar Möglichkeiten:

  • Verwenden Sie die Dynamic Linq- Bibliotheken, um Ihre Abfragen im Handumdrehen zu erstellen . Der beste Einstieg ist der Blogeintrag von ScottGu . Ich glaube jedoch nicht, dass diese Bibliotheken die contains-Methode in Ihrem Beispiel unterstützen. Hier ist ein Blogbeitrag, der erklärt, wie man diese Unterstützung hinzufügt.

  • Führen Sie SQL- Anweisungen direkt aus. Überprüfen Sie die MSDN-Dokumentation für Linq to Sql oder Linq to Entities .

    var _Products = myEntities.ExecuteStoreQuery<Product>
    (@"SELECT * FROM Products WHERE [Name] In ('Item1', 'Item2')");
  • Verwenden Sie das zusammensetzbare Verhalten von Linq . Dies ist vielleicht nicht die eleganteste Lösung, aber es funktioniert wirklich gut, wenn Sie nicht zu viele Optionen haben. Sie können Ihre Abfrage einfach in mehreren Teilen erstellen.

    var _Products = from product in myEntities.Products
                    select product
    
    _Products = from product in _Products 
                where product.Name.Contains(_Name)
                select product
    
    if FilterByPrice {
        _Products = from product in _Products 
                    where product.Price > 100 
                    select product
    }





var