public Expression GetFilterExpression(ParameterExpression itemPram, FilterComparisonOperator comparisonOperator, string valueString) { var getterMemberExpr = _reader.GetSelectExpression(itemPram); if (getterMemberExpr == null) { throw new InvalidCastException("Getter expression returned from IFieldReader is not of type MemberExpression."); } object valueObj = ConversionUtility.ConvertString(valueString, _reader.FieldType); ConstantExpression variableExpression = Expression.Constant(valueObj, _reader.FieldType); // TODO variable not constant? var operatorMethod = GetOperatorExpressionMethod(comparisonOperator); Expression predicateExpression = operatorMethod.Invoke(getterMemberExpr, variableExpression); return(predicateExpression); }
public MemberInitExpression Build <TItem>(ParameterExpression itemPram, IFieldProvider <TItem> fieldProvider) where TItem : class { return(Build(delegate(FieldInfo fi) { IFieldReader <TItem> reader = fieldProvider.GetReader(fi.Name); Debug.Assert(reader != null, "Reader should definitely not be null here."); return Expression.Bind(fi, reader.GetSelectExpression(itemPram)); })); }
public MemberInitExpression Build <TItem>(ParameterExpression itemPram, IDictionary <string, IFieldReader <TItem> > fieldReaders) where TItem : class { return(Build(delegate(FieldInfo fi) { Debug.Assert(fieldReaders.ContainsKey(fi.Name)); IFieldReader <TItem> reader = fieldReaders[fi.Name]; return Expression.Bind(fi, reader.GetSelectExpression(itemPram)); })); }
/// <summary> /// Loads a single scalar field reader from a single <see cref="itemQuery"/>. /// </summary> public static async Task <object> LoadScalarValueAsync <TItem>([NotNull] IFieldReader <TItem> reader, IQueryableSingle <TItem> itemQuery, ForEachAsyncDelegate <object> forEachAsync) { if (reader == null) { throw new ArgumentNullException(nameof(reader)); } ParameterExpression itemPram = Expression.Parameter(typeof(TItem), "itm"); Expression selectExpression = reader.GetSelectExpression(itemPram); IQueryable selectScalarOnlyQuery = ExpressionTreeHelpers.GetSelectExpressionQuery(itemQuery, itemPram, selectExpression); object loadedValue = await ItemQueryHelper.SingleOrCreateAsync(selectScalarOnlyQuery, forEachAsync, () => throw new ParentItemNotFoundException()); if (reader.Replacer != null) { await reader.Replacer.LoadAsync(itemQuery); return(reader.Replacer.GetReplacement(loadedValue)); } return(loadedValue); }
public Expression GetSelectExpression(ParameterExpression itemPram) { return(_fieldReaderImplementation.GetSelectExpression(itemPram)); }