protected Func <TableEntityRow, object> Get_GetProjectedValue_Computation(IRequestedBinding requestedBinding) { if (requestedBinding is QueryBinding) { var originalQueryType = projectedType.Fields.First(kvp => kvp.Key.Name == "Field0").Value; var valueGetter = Get_GetProjectedValue_Computation(originalQueryType, (requestedBinding as QueryBinding).Value); return(source => valueGetter(source.Values[0])); } //Then its an include binding else { var projectionIndex = projectedType.RelatedBindings.IndexOf(requestedBinding as IncludeBinding) + 1; return(source => source.Values[projectionIndex]); } }
private bool IsManyToManyBinding(IRequestedBinding target) { if (target is IncludeBinding) { var include = target as IncludeBinding; var memberExpression = include.IncludeDirective.GetSelector().Body as MemberExpression; return(IsManyToMany(memberExpression.Member)); } else if (target is QueryBinding) { var queryType = (target as QueryBinding).Value; return(queryType.NonPrimitiveEnumerableItemType != null && queryType.NonPrimitiveEnumerableItemType is ManyToManyMapType); } else { return(false); } }
public static bool MatchesTarget(this IRelatedBinding relatedBinding, IRequestedBinding target) { return relatedBinding.TargetBinding == target; }
private List <IncludeBinding> GetIncludeBindings(IEnumerable <QueryBinding> queryBindings) { var bindings = new List <IncludeBinding>(); Func <MemberExpression, IncludeBinding> getExistingBinding = m => bindings.Find(id => ExpressionUtil.IsEquivalent(id.IncludeDirective.GetSelector().Body, m)); Func <MemberExpression, IncludeDirective> getIncludeDirective = m => { var member = m.GetDepth() == 1 ? m : Expression.MakeMemberAccess(Expression.Parameter(m.Expression.Type, m.Expression.Type.Name.Substring(0, 1).ToLower()), m.Member); return(IncludeDirectiveUtil.GetIncludeDirective(member)); }; foreach (var qb in queryBindings) { //Allowing not included collections to be used for collection includes foreach (var include in qb.Value.Includes)//.Where(inc => !(inc is IIncludeInCollectionDirective))) { IRequestedBinding targetBinding = qb; foreach (MemberExpression member in GetMembers(include.GetSelector().Body as MemberExpression)) { var existingBinding = getExistingBinding(member); if (existingBinding != null) { targetBinding = existingBinding; } else { var includeDirective = getIncludeDirective(member); var currentMemberName = (targetBinding is QueryBinding) ? (targetBinding as QueryBinding).Value.GetMemberName(member.Member) : member.Member.Name; var binding = new IncludeBinding() { IncludeDirective = includeDirective, TargetBinding = targetBinding, TranslatedExpression = typeTranslationUtil.GetTranslatedMemberExpression (member.Expression.Type, currentMemberName, targetBinding.TranslatedExpression) }; bindings.Add(binding); targetBinding = binding; } } } foreach (var collInclude in qb.Value.Includes.Where(inc => inc is IIncludeInCollectionDirective)) { var collectionSelector = collInclude.GetSelector().Body as MemberExpression; var target = getExistingBinding(collectionSelector); if (target != null) { bindings.Add(new UnprojectedIncludeInCollectionBinding { IncludeDirective = collInclude, TargetBinding = target }); } } } return(bindings); }
public static bool MatchesTarget(this IRelatedBinding relatedBinding, IRequestedBinding target) { return(relatedBinding.TargetBinding == target); }