Я предлагаю еще одно усовершенствование решений PredicateBuilder и ExpressionVisitor
. Я назвал его UnifyParametersByName
, и вы можете найти его в моей MIT-библиотеке: LinqExprHelper . Это позволяет комбинировать произвольные лямбда-выражения. Обычно задаются вопросы о предикатном выражении, но эта идея распространяется и на проекционные выражения.
В следующем коде используется метод ExprAdres
, который создает сложное параметризованное выражение, используя встроенную lambda. Это сложное выражение кодируется только один раз, а затем повторно используется благодаря мини-библиотеке LinqExprHelper
.
public IQueryable UbezpFull
{
get
{
System.Linq.Expressions.Expression<
Func> expr =
(u, parAdrM, parAdrZ) => new UbezpExt
{
Ub = u,
AdrM = parAdrM,
AdrZ = parAdrZ,
};
// From here an expression builder ExprAdres is called.
var expr2 = expr
.ReplacePar("parAdrM", ExprAdres("M").Body)
.ReplacePar("parAdrZ", ExprAdres("Z").Body);
return UBEZPIECZONY.Select((Expression>)expr2);
}
}
И это строительный код подвыражения:
public static Expression> ExprAdres(string sTyp)
{
return u => u.UBEZP_ADRES.Where(a => a.TYP_ADRESU == sTyp)
.OrderByDescending(a => a.DATAOD).FirstOrDefault();
}
То, что я пытался достичь, - это выполнить параметризованные запросы без необходимости скопировать-вставить и с возможностью использования встроенных lambdas, которые так хороши. Без всех этих вспомогательных выражений я был бы вынужден создать целый запрос за один раз.