2016-11-10 3 views
2

Ich versuche mit der Dynamic Linq-Bibliothek zu arbeiten, um meine Entity-Framework-Datenquelle abzufragen. Ich habe das richtige Paket zu meinem Projekt hinzugefügt und haben die folgende SyntaxDynamic Linq funktioniert nicht

var salesEntities = dashboardEntity.FactSales.Where(d => d.DateKey >= startDate).Where(d => d.DateKey <= endDate) 
            .Where(c => c.CompanyID == companyID) 
            .Where("[email protected]",1) 
            .ToList(); 

ich auch

versucht
.Where("StoreID=1") 

basierend auf dem Beispiel, das ich auf dem ScottGu Blogeintrag gefunden haben, verwendet werden, die am meisten dynamische Abfrage SO Fragen scheinen zu suggerieren. Kann mir jemand helfen, zu sehen, was mir fehlt, damit das funktioniert?

Es produziert nicht und Fehler es nur fehlschlägt, irgendwelche Daten überhaupt zurückzugeben.

+0

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

+0

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. –

+0

Könnten Sie versuchen '.Where (s => s.StoreID == 1)'? Gibt es Daten zurück? – uTeisT

Antwort

2

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:

+0

Danke, ich wusste nie über die Funktionalität von .Das war eine große Hilfe! – Nate58

+0

@NateGreene Ich habe meine Antwort erweitert. –

0

Idk, wenn Sie das aussortiert haben, aber ich habe gerade Ihre Antwort auf meinen Kommentar bemerkt.

Ich denke, was Sie fehlen, ist = statt == beim Vergleich StoreID.

var salesEntities = dashboardEntity.FactSales.Where(d => d.DateKey >= startDate).Where(d => d.DateKey <= endDate) 
           .Where(c => c.CompanyID == companyID) 
           .Where("StoreID = @0",1) 
           .ToList();