Ich versuche, mithilfe von Dynamic Linq mithilfe von Entity Framework (EF) eine Teilmenge von Personen aus einer Datenbank abzurufen. Bei der Verwendung der Includes-Operation tritt ein Problem auf. Hier ist die Entität für die Personentabelle:
public class Person
{
public string Id { get; set; }
public string Name { get; set; }
public string Address { get; set; }
public string City { get; set; }
public string State { get; set; }
public string ZipCode { get; set; }
}
Hier ist eine Abfrage, die erfolgreich funktioniert.
var people = personContext
.People
.OrderBy("id asc")
.Skip(0)
.Take(5)
.ToList();
Beachten Sie, dass ich in der OrderBy-Methode dynamisches Linq verwende. Wenn ich jedoch versuche, Filterung anzuwenden, wird eine Ausnahme angezeigt.
var people = personContext
.People
.Where("id.Contains(15)")
.OrderBy("id asc")
.Skip(0)
.Take(5)
.ToList();
Was ich zurückbekommen möchte, ist eine Untergruppe von Personen mit IDs, die den Teilstring "15" enthalten, wie z.
"015", "115", "151", "152", etc.
Wenn ich den Code ausführe, wird der folgende Fehler angezeigt.
System.Linq.Dynamic.ParseException was unhandled by user code
Message=No applicable method 'Contains' exists in type 'String'
Wie lautet die Syntax, um festzustellen, ob das ID-Feld die Zeichenfolge "15" enthält?
Wie lautet die Syntax, um festzustellen, ob das ID-Feld die Zeichenfolge "15" enthält?
Nun, definitiv nicht .Where("id.Contains(15)")
das versucht, die Methode aufzurufen. Contains
numerischen Wert 15.
Gemäß der Dokumentation können Sie entweder ein Zeichenfolgenliteral verwenden :
.Where("id.Contains(\"15\")")
oder Substitutionswerte :
.Where("id.Contains(@0)", "15")
Ich habe hier ein Missverständnis ... Sie sollten LINQ nicht so verwenden. Zu Beginn müssen Sie die Überladungen aufrufen, die Lambdas akzeptieren. Dann geben Sie die Eigenschaft im Lambda an und wenn es sich um eine Zeichenfolge handelt, die Sie aufrufen, Contains
sie diese. Wie so:
var people = personContext
.People
.Where(p => p.Id.Contains("15"))
.OrderByDescending(p => p.Id)
.Skip(0) // You don't need this line.
.Take(5)
.ToList();
Der EF selbst übernimmt das schwere Heben und übersetzt diese reinen C # -Codes in die richtigen SQL-Anweisungen.