znalazłem następujące pytanie, które można połączyć wiele Expression<Func<T,bool>>
wyrażeń:Kombajny OrderBy Expression z których ekspresja
How to merge two C# Lambda Expressions without an invoke?
Zastanawiam się, czy stosując podobną technikę, jak go o scalanie .OrderBy Expression<Func<Entity, Key>>
z .Where Expression<Func<Entity, bool>>
w jednym wyrażeniu typu lub dziedziczącym z typu, System.Linq.Expressions.Expression
.
Robię naprawdę przycięte klasy stylu QueryProvider do przyjmowania T => T == ...
Func za pośrednictwem publicznych metod .Where
i .OrderBy
. Ma to na celu, że wyrażenie budowane w tej klasie zostanie przekazane do QueryTranslatora w celu utworzenia odpowiedniego kodu SQL.
Kwerendranslator tego stylu, wywołany z QueryProvider, zwykle przyjmuje jeden argument System.Linq.Expressions.Expression
jako argument, który następnie tłumaczy na SQL.
Potrafię wykonać i zrozumieć powyższe pytanie dotyczące łączenia dwóch funkcji .Where
. Poniższy strony po to szczególnie użyteczne do tego, i śledzone przez każdy z przykładów:
http://blogs.msdn.com/b/meek/archive/2008/05/02/linq-to-entities-combining-predicates.aspx
Artykuł CodeProject również przydatne:
http://www.codeproject.com/Articles/24255/Exploring-Lambda-Expression-in-C
przypadku kombinacji .OrderBy Func z .Where Func jednak oba mają różne ogólne argumenty. W przypadku .Where to jest Func<Entity, bool>
, aw przypadku .OrderBy jest to Func<Entity, Key>
.
Połączenie tych dwóch wyrażeń na powierzchni nie jest tak proste, jak połączenie dwóch z tymi samymi ogólnymi argumentami.
Wbudowany silnik wytwarzający ekspresję Func (niepewny dokładnego terminu) jest w stanie połączyć .Where Func z .OrderBy Func. Ciekawi mnie, co dzieje się pod maską, gdy te dwa wyrażenia zostają scalone, aby stać się jednym z nich: System.Linq.Expressions.Expression
. Czy jest to możliwe, a jeśli tak, to w jaki sposób łączyłbyś Expression<Func<Entity, bool>>
z Expression<Func<Entity,Key>>
zakładając, że Podmiot jest tego samego typu w każdym Wyrażeniu?
Jak powinno wyglądać wyrażenie wynikowe? – dtb
Powinien być taki sam jak .Where (T => T.Name == "Cooper") OrderBy (T => T.DateOfBirth) – Anthony
Scalenie '.Where (x => warunek1) .Where (x = > condition2) 'to' .Where (x => condition1 && condition) 'ale nie możesz scalić' .Where (warunek x =>) .OrderBy (x => value) 'w tym samym znaczeniu. A zatem, jak powinno wyglądać wyrażenie wynikowe? 'queryable.Where (warunek x =>) .OrderBy (x => wartość)' nie zwraca wyrażenia, zwraca 'IQueryable'. –
dtb