TL; DR
Sind Sie sicher, dass Sie für diese dynamische LINQ benötigen?
List<int> storeIDs = new List<int>() {1,2,3};
var salesEntities = dashboardEntity.FactSales
.Where(d => d.DateKey >= startDate)
.Where(d => d.DateKey <= endDate)
.Where(c => c.CompanyID == companyID)
.Where(c => storeIDs.Contains(c.StoreID))
.ToList();
Lange Version
LINQ ermöglicht Compiler generierten Ausdrücke:
IQueryable<FactSales> qry;
qry = qry.Where(x => x.DateKey >= startDate);
Wenn die Ausdrücke zur Laufzeit ändern müssen, ist es möglich, den Ausdruck erstellen mit statische Methoden in der System.Linq.Expressions.Expression
class:
//using static System.Linq.Expressions.Expression;
//x
var parameter = Parameter(typeof(FactSale));
//x.DateKey
var dateKey = MakeMemberAccess(parameter, typeof(FactSales).GetProperty("DateKey"));
//(the value in startDate, as if it had been written in)
var startDateConst = Constant(startDate);
//x.DateKey >= (value of startDate)
var comparison = GreaterThanOrEqual(dateKey, startDateConst);
//x => x.DateKey >= (value of startDate)
var lmbd = Lambda<Func<FactSale,bool>>(comparison, new [] {prm});
//pass the expression into the Queryable.Where method
qry = qry.Where(lmbd);
Dynamic LINQ-Bibliothek (deren neueste Inkarnation kann here finden) ermöglicht Ausdrücke Zeichenketten zu erzeugen:
IQueryable<FactSales> qry;
qry = qry.Where("DateKey >= @0", startDate);
Dynamische LINQ ist äußerst nützlich, wenn der Ausdruck ist nicht bekannt, bei der Kompilierung, aber in diesem Fall , der Ausdruck ist zur Kompilierzeit bekannt (in diesem Fall mit der List<T>.Contains
method. Daher sehe ich keinen Grund, Dynamic LINQ hier zu verwenden.
N.B. Ich weiß immer noch nicht, warum das nicht funktioniert:
Ich habe gerade ein einfaches Testbeispiel erstellt, der Grund, warum ich Dynamic Linq verwenden muss, ist, weil Benutzer in der Lage sein müssen, 1 oder mehrere Geschäfte zu wählen dynamisch zur Laufzeit anzeigen, deshalb ist .Where() für StoreID von den anderen getrennt – Nate58
Das letzte Mal, als ich linq überprüft habe, unterstützt es diese Art von Syntax nicht. Sie müssen möglicherweise Ihre eigenen Prädikate erstellen ... Prädikate werden im Grunde verwendet, um dynamische Abfragen zu erstellen ... denken Sie wie eine Multi-Filter-Suche als mögliches Szenario. Hier ist ein gutes Beispiel: http: //www.c-sharpcorner.com/UploadFile/c42694/dynamic-query-in-linq-using-predicate-builder/... auch C# 6.0 hat bereits einen 'PredicateBuilder', den Sie Vielleicht möchten Sie überprüfen. –
Könnten Sie versuchen '.Where (s => s.StoreID == 1)'? Gibt es Daten zurück? – uTeisT