Seltsam, Linq to Entities Verhalten mit AsExpandable()
Betrachten Sie die folgenden Person
Person:
public class Person
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
Anhand der folgenden Expression
(konstruiert mit PredicateBuilder
) als die Kriterien:
var byName = PredicateBuilder.True<Person>().And(x => x.FirstName == "Chaim");
Wenn Sie angerufen werden, verwenden Sie die folgende syntax, die generierte SQL ist in Ordnung (die auch den WHERE
- Anweisung):
ctx.Set<Person>().AsExpandable().Where(x => byName.Invoke(x));
Jedoch, wenn Sie angerufen werden, mit dieser etwas andere syntax, kein SQL WHERE
beteiligt ist, und die Filterung wird durchgeführt, indem Enumerable.Where
statt:
ctx.Set<Person>().AsExpandable().Where(byName.Invoke);
Irgendwelche Gedanken?
- Dies ist extrem gefährlich. Ich rief
Where(expression.Compile())
stattWhere(x => expression.Invoke(x))
. Später dann, nach der tracing-unsere Produktions-Datenbank für saugen, ich seheselect [every column] from Table
; ohne where-Klausel. Der ehemalige kommt direkt von den docs!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es keine implizite Konvertierung von einer Methode, die Gruppe zu einem
Expression
(eine entsprechende delegate-Typ). Es ist eine implizite Konvertierung von einer Methode der Gruppe um ein Delegat, der eine passende Signatur. Daher nur dieIEnumerable
überlast entspricht.Natürlich, das ist nicht zu sagen, dass Sie benötigen, um ein lambda. Schreiben Sie einfach:
Seit Sie vorbei sind in einem Ausdruck (
ByName
ist, nachdem alle, eineExpression<Person, bool>
schon, das ist genau das, wasQueryable.Where<Person>
erfordert) dies wird beurteilen, wie eine Abfrage, die nicht in linq to objects.ByName.Invoke
istFunc<Person, bool>
dann nur SpieleIEnumerable.Where
, währendx => ByName.Invoke(x)
istExpression<Func<Person, bool>>
dann passtIQueryable.Where
?Queryable.Where
undEnumerable.Where
gültig sind Optionen, und es bewegt sich auf einem betterness Algorithmus.Queryable
gewinnt.ByName.Invoke
, dass nur eine Methode Gruppe, wie jede andere Methode-Gruppe, ist nicht konvertierbar ist zu einerExpression
, soEnumerable.Where
ist das nur möglich, gültig zu überlasten.