2016-03-31 13 views
2

ich mich gefragt, ob es einen Weg gibt Expression Klasse für benutzerdefinierte Abfragen mit LINQ-Abfragen, wie diesMit Expression Klasse mit LINQ-Abfragen

Expression<Func<TEntity, bool>> expression = (x) => x.Id = 1 

var items = from item in context.TEntity 
where expression 
select item 

Ich weiß, es gibt einen Weg zu verwenden, dies mit LINQ Funktion als Wo zu tun Funktion nimmt einen Ausdruck als Parameter, aber ich brauche wirklich dieses mit LINQ-Abfragen

Notiz zu tun: der obige Code nur ein Beispiel ist, dass Sie um zu machen, was ich versuche, es ist nicht ein tatsächliches Arbeits Code zu tun

hinweis 2: Ich brauche das mit Enti zu arbeiten ty Framework

Antwort

3

Leider unterstützt Entity Framework diese Art von Ausdrucksprojektion nicht nativ, weshalb ein allgemeiner Versuch wie where expression.Compile().Invoke(item); zur Laufzeit eine Ausnahme auslöst.

Wenn Sie jedoch die LinqKit Bibliothek verwenden und rufen .AsExpandable() auf dem Entitätssatz (die die Expression von Gästen benutzt), dann können Sie Ihren Ausdruck aufrufen dynamisch:

Expression<Func<TEntity, bool>> expression = x => x.Id == 1; 

var items = from item in context.Set<TEntity>.AsExpandable() 
where expression.Invoke(item) 
select item; 
+0

Whoops Sie richtig erkennt. Das Invoke ist eine Erweiterungsmethode von Linqkit, die in Verbindung mit AsExpandable funktioniert. –

+1

Das funktioniert gut mit LinqKit, ich habe + 1'ed – Jcl

+0

@DavidL, Ahh, macht jetzt Sinn. Danke für das Update. –

1

Dies funktioniert, zumindest auf EF-Core (Ich habe es gerade getestet). Habe kein EF6-Projekt zur Hand, wo ich testen könnte.

Expression<Func<TEntity, bool>> expression = (x) => x.Id = 1 

var items = from item in context.TEntity 
where expression.Compile()(item); 
select item 

Update: Ich habe gerade ein einfaches Testprojekt auf EF6 und es ist noch nicht funktionieren, da es nicht den Ausdruck Aufruf

+0

Ich bin wirklich überrascht, dass es bei EF Core funktioniert hat ... Ich muss überprüfen, ob es lokale Filterung (von der ich hörte, dass sie unterstützt wurde) oder tatsächlich auf SQL umgestellt wird, aber dafür habe ich jetzt keine Zeit. – Jcl

+2

Es ist in der Tat lokale Filterung. Sie haben also die Laufzeitausnahme beseitigt, aber Sie müssen die Protokollierung aktivieren und jede Abfrage überprüfen, wenn Sie sichergehen wollen, dass sie auf der Seite der Datenbank ausgeführt wird. –

+0

@IvanStoev Ja, das war meine Vermutung ... Ich habe es versucht, die Protokollierung zu aktivieren, aber es scheint keinen einheitlichen Weg dafür zu geben und ich hatte nicht viel Zeit es zu testen (sie haben es 3 Mal in 3 verschiedenen geändert) Versionen, und die letzte Methode, die ich bei einem GitHub-Problem gefunden habe, funktionierte nicht mit den veröffentlichten nuget-Paketen) – Jcl

Verwandte Themen