Ich habe ein ungewöhnliches Problem mit EF 6-Code behoben, bei dem Abfragen mit dem Oracle.ManagedDataAccess.Client-Treiber manchmal mehrere Minuten dauern, bis die zugrunde liegende Abfrage ausgeführt wird 2ms. Ein Beispiel Abfrage würde wie folgt aussehen:Dynamische Generierung von Lambda-Ausdruck mit Konstanten aus Variablen
var result = users.Where(u => u.username == varUserName).FirstOrDefault();
Diese Abfrage kann einige Minuten dauern jedoch zurück, wenn ich die Abfrage mit der gleichen Sache mit einer Konstante in der Lambda-Funktion ersetzen, läuft es sofort:
var result = users.Where(u => u.username == "testUsername").FirstOrDefault();
, um dieses Problem zu umgehen, ich entweder parametrisierte SQL-Abfragen schreiben kann, oder ich kann einen geeigneten Lambda-Ausdruck Baum manuell erzeugen:
var userParam = Expression.Parameter(typeof(Entity.User), "user");
var userNameField = Expression.Property(userParam, "username");
var userNameConstant = Expression.Constant(varUserName, typeof(string));
var equalUserName = Expression.Equal(userNameField, userNameConstant);
var lambda = Expression.Lambda<Func<Entity.User, bool>>(equalUserName, new ParameterExpression[] { userParam });
var result = users.Where(lambda).FirstOrDefault();
Da diese Arbeit s, es stellt sich die Frage: gibt es eine Möglichkeit, einfach Lambda-Ausdruck Bäume zu generieren, die dazu führen, Variablen direkt als Konstanten anstelle von Verweisen auf Variablen enthalten?
Zum Beispiel so etwas wie dies wäre ideal:
var lambdaExpression = (u => u.username == varUserName).ReplaceVariablesWithConstants();
Haben Sie nicht gemeint: 'var userNameConstant = Expression.Constant (varUserName, typeof (string)); ' –
Ich tat sicherlich, danke @JeroenvanLangen – fabspro