public static IEnumerable <TSource> Where <TSource>(this IndexDefinition <TSource> source, Expression <Func <TSource, bool> > predicate) { Func <TSource, bool> func = predicate.Compile(); if (predicate.NodeType == ExpressionType.Lambda) { LambdaExpression lambdaExpression = (LambdaExpression)predicate; if (lambdaExpression.Body.NodeType == ExpressionType.AndAlso) { return(WhereExpressionBuilder.And(source, (BinaryExpression)lambdaExpression.Body, func)); } else if (lambdaExpression.Body.NodeType == ExpressionType.OrElse) { return(WhereExpressionBuilder.Or(source, (BinaryExpression)lambdaExpression.Body, func)); } else if (lambdaExpression.Body.NodeType == ExpressionType.LessThan) { return(WhereExpressionBuilder.LessThanOrLessThanOrEqaul(source, (BinaryExpression)lambdaExpression.Body, func, LogicalEnum.LessThan)); } else if (lambdaExpression.Body.NodeType == ExpressionType.LessThanOrEqual) { return(WhereExpressionBuilder.LessThanOrLessThanOrEqaul(source, (BinaryExpression)lambdaExpression.Body, func, LogicalEnum.LessThanOrEqual)); } else if (lambdaExpression.Body.NodeType == ExpressionType.GreaterThan) { return(WhereExpressionBuilder.GreaterThanOrGreaterThanOrEqual(source, (BinaryExpression)lambdaExpression.Body, func, LogicalEnum.GreaterThan)); } else if (lambdaExpression.Body.NodeType == ExpressionType.GreaterThanOrEqual) { return(WhereExpressionBuilder.GreaterThanOrGreaterThanOrEqual(source, (BinaryExpression)lambdaExpression.Body, func, LogicalEnum.GreaterThanOrEqual)); } else if (lambdaExpression.Body.NodeType == ExpressionType.Equal) { return(WhereExpressionBuilder.Equal(source, (BinaryExpression)lambdaExpression.Body, func)); } else { return(source.Source.Where(func)); } } return(source.Source.Where(func)); }
public Task <TAggregateRoot> GetByIdAsync(TId id) { var exp2 = WhereExpressionBuilder.GetEqual(id); return(GetAsync(exp2)); }
public PreparedQueryPlan PrepareQuery(HarmonyQueryCompilationContext compilationContext) { var rootExpr = RootExpressions[_valueBufferParameter]; var processedOns = new List <object>(); var flatList = new List <Tuple <HarmonyTableExpression, QueryBuffer.TypeBuffer> >(); var typeBuffers = new QueryBuffer.TypeBuffer[] { GetTypeBuffer(rootExpr, flatList) }; var expressionTableMapping = flatList.ToDictionary(kvp => kvp.Item1.RootExpression.ConvertedParameter as Expression, kvp => kvp.Item1 as IHarmonyQueryTable, new ExpressionValueComparer()); var tableList = flatList.Select(tpl => tpl.Item1 as IHarmonyQueryTable).ToList(); //extract all of expressions that might represent a given table and add them to the mapping dictionary foreach (var table in tableList) { foreach (var alias in ((HarmonyTableExpression)table).Aliases) { if (!expressionTableMapping.ContainsKey(alias)) { expressionTableMapping.Add(alias, table); } } } var whereBuilder = new WhereExpressionBuilder(rootExpr.IsCaseSensitive, tableList, expressionTableMapping); var processedWheres = new List <Object>(); var orderBys = new List <Tuple <FileIO.Queryable.FieldReference, bool> >(); foreach (var expr in rootExpr.WhereExpressions) { whereBuilder.VisitForWhere(expr, processedWheres, processedOns); } foreach (var tpl in flatList) { foreach (var expr in tpl.Item1.OnExpressions) { var madeOn = whereBuilder.VisitForOn(expr); if (madeOn != null) { processedOns.Add(madeOn); if (tpl.Item2.JoinOn == null) { tpl.Item2.JoinOn = madeOn; } else { throw new NotImplementedException(); } } } if (tpl.Item1 != rootExpr) { foreach (var expr in tpl.Item1.WhereExpressions) { var madeOn = whereBuilder.VisitForOn(expr); if (madeOn != null) { processedOns.Add(madeOn); if (tpl.Item2.JoinOn != null) { madeOn = new ConnectorPart() { Op = WhereClauseConnector.AndOperator, Left = tpl.Item2.JoinOn, Right = madeOn } } ; tpl.Item2.JoinOn = madeOn; } } } foreach (var expr in tpl.Item1.OrderByExpressions) { var fieldRef = whereBuilder.VisitForOrderBy(expr.Item1); if (fieldRef != null) { orderBys.Add(Tuple.Create(fieldRef, expr.Item2)); } } } var queryBuffer = new QueryBuffer(flatList.Select(tpl => tpl.Item2).ToList()); var fieldReferences = new Dictionary <int, List <FieldDataDefinition> >(); foreach (var queryExpr in flatList) { if (queryExpr.Item1.ReferencedFields.Count > 0) { var bufferIndex = queryBuffer.TypeBuffers.IndexOf(queryExpr.Item2); fieldReferences.Add(bufferIndex, queryExpr.Item1.ReferencedFields); } } var queryPlan = new PreparedQueryPlan(true, processedWheres, fieldReferences, processedOns, orderBys, queryBuffer, ""); return(queryPlan); }