public OQuery Attach(OQuery src, IExpression expression) { if (expression is TakeExpression && expression.OQueryExpression != null) { src.Take(expression.OQueryExpression._top); } else if (expression is SkipExpression && expression.OQueryExpression != null) { src.Skip(expression.OQueryExpression._skip); } else if (expression is OrderExpression) { var orderExpression = (OrderExpression)expression; if (orderExpression.Descending) src.OrderbyDesc(orderExpression.FieldName); else src.Orderby(orderExpression.FieldName); } else if (expression is AndAlsoExpression) { var andAlsoExpression = (AndAlsoExpression) expression; if (andAlsoExpression.Left != null) Attach(src, andAlsoExpression.Left); if (andAlsoExpression.Right != null) Attach(src, andAlsoExpression.Right); } else if (expression is OrElseExpression) { var orElseExpression = (OrElseExpression) expression; if (orElseExpression.Left != null) Attach(src, orElseExpression.Left); if (orElseExpression.Right != null) Attach(src, orElseExpression.Right); } if (expression.OQueryExpression != null) { src.Attach(expression.OQueryExpression); } if (expression is Expression) { var exp = (Expression)expression; if (exp.InnerExpression != null) return Attach(src, exp.InnerExpression); } return src; }