internal virtual DbExpression OfType(TypeUsage type) { // s.OfType<T> is normally translated to s.Filter(e => e is T).Project(e => e as T) DbExpressionBinding rootBinding = _root.BindAs(_aliasGenerator.Next()); DbExpression filter = this.Filter(rootBinding.Filter(rootBinding.Variable.IsOf(type))); OrderByLifterBase filterLifter = GetLifter(filter, _aliasGenerator); DbExpressionBinding filterBinding = filter.BindAs(_aliasGenerator.Next()); DbExpression project = filterLifter.Project(filterBinding.Project(filterBinding.Variable.TreatAs(type))); return(project); }
private OrderByLifterBase GetLifter(DbExpression root) { return(OrderByLifterBase.GetLifter(root, _aliasGenerator)); }
internal DbExpression Limit(DbExpression argument, DbExpression limit) { OrderByLifterBase lifter = GetLifter(argument); return(lifter.Limit(limit)); }
internal DbExpression Skip(DbExpressionBinding input, DbExpression skipCount) { OrderByLifterBase lifter = GetLifter(input.Expression); return(lifter.Skip(skipCount)); }
internal DbExpression OfType(DbExpression argument, TypeUsage type) { OrderByLifterBase lifter = GetLifter(argument); return(lifter.OfType(type)); }
internal DbExpression Filter(DbExpressionBinding input, DbExpression predicate) { OrderByLifterBase lifter = GetLifter(input.Expression); return(lifter.Filter(input.Filter(predicate))); }
internal DbExpression Project(DbExpressionBinding input, DbExpression projection) { OrderByLifterBase lifter = GetLifter(input.Expression); return(lifter.Project(input.Project(projection))); }