Esempio n. 1
0
        private static Expression MakeEntitytSetWhereListContains <TEnt, TElem>(IList <TElem> list, string memberName)
        {
            var entSet = new EntitySet <TEnt>();
            var query  = entSet.Where(ent => list.Contains(ExpressionMaker.GetProperty <TEnt, TElem>(ent, memberName)));

            return(query.Expression);
        }
Esempio n. 2
0
        private static void Setup_SelectByKeyValueArray(SpecialLinqCommand command)
        {
            var member         = command.Key.ExpandedKeyMembers[0].Member;
            var listType       = typeof(IList <>).MakeGenericType(member.DataType);
            var listPrm        = Expression.Parameter(listType, "@list");
            var entType        = command.Key.Entity.EntityType;
            var pred           = ExpressionMaker.MakeListContainsPredicate(member, listPrm);
            var entSet         = member.Entity.EntitySetConstant;
            var entSetFiltered = ExpressionMaker.MakeCallWhere(entSet, pred);
            var entSetOrdered  = ExpressionMaker.AddOrderBy(entSetFiltered, command.OrderBy);

            command.Lambda = Expression.Lambda(entSetOrdered, listPrm);
        }
Esempio n. 3
0
 protected override Expression VisitMethodCall(MethodCallExpression node)
 {
     if (node.Method.IsEntitySetMethod())
     {
         var entType = node.Type.GetGenericArguments()[0];
         return(ExpressionMaker.MakeEntitySetConstant(entType));
     }
     if (node.Method.DeclaringType == typeof(EntityQueryExtensions) && node.Method.Name == nameof(EntityQueryExtensions.Include))
     {
         return(Visit(node.Arguments[0])); //Include lambda was already added to Info.Includes by analyzer
     }
     return(base.VisitMethodCall(node));
 }
Esempio n. 4
0
        public static void Setup_CheckChildExists(SpecialLinqCommand command)
        {
            var key     = command.Key;
            var entType = key.Entity.EntityType;
            //build expression
            var prms        = key.ExpandedKeyMembers.Select(m => Expression.Parameter(m.Member.DataType, "@" + m.Member.MemberName)).ToArray();
            var entSet      = key.Entity.EntitySetConstant;
            var genAny      = LinqExpressionHelper.QueryableAny2ArgMethod.MakeGenericMethod(entType);
            var pred        = ExpressionMaker.MakeKeyPredicate(key, prms);
            var anyCallExpr = Expression.Call(genAny, entSet, pred);
            var lambdaExpr  = Expression.Lambda(anyCallExpr, prms);

            command.Lambda = lambdaExpr;
        }
Esempio n. 5
0
        private static void Setup_SelectByValueArrayManyToMany(SpecialLinqCommand command)
        {
            var listInfo        = command.ListInfoManyToMany;
            var fkMember        = listInfo.ParentRefMember.ReferenceInfo.FromKey.ExpandedKeyMembers[0].Member;
            var listType        = typeof(IList <>).MakeGenericType(fkMember.DataType);
            var listPrm         = Expression.Parameter(listType, "@list");
            var entType         = listInfo.LinkEntity.EntityType;
            var wherePred       = ExpressionMaker.MakeListContainsPredicate(fkMember, listPrm);
            var linkEntSet      = fkMember.Entity.EntitySetConstant;
            var entSetFiltered  = ExpressionMaker.MakeCallWhere(linkEntSet, wherePred);
            var targetRefMember = listInfo.OtherEntityRefMember;
            var entSetOrdered   = AddOrderByManyToMany(entSetFiltered, listInfo.LinkEntity, listInfo.OtherEntityRefMember, command.OrderBy);
            var newTupleLambda  = ExpressionMaker.MakeNewLinkTupleLambda(listInfo.OtherEntityRefMember);
            var selectTuple     = ExpressionMaker.MakeCallSelect(entSetOrdered, newTupleLambda);

            command.Lambda = Expression.Lambda(selectTuple, listPrm);
        }
Esempio n. 6
0
        // Setup methods

        private static void Setup_SelectByKey(SpecialLinqCommand command)
        {
            var key      = command.Key;
            var lockType = command.LockType;
            var orderBy  = command.OrderBy;

            var entType = key.Entity.EntityType;
            var prms    = key.ExpandedKeyMembers.Select(m => Expression.Parameter(m.Member.DataType, "@" + m.Member.MemberName)).ToArray();
            var pred    = ExpressionMaker.MakeKeyPredicate(key, prms);
            var entSet  = (lockType == LockType.None) ? key.Entity.EntitySetConstant
                                               : ExpressionMaker.MakeEntitySetConstant(entType, lockType);
            var entSetFiltered = ExpressionMaker.MakeCallWhere(entSet, pred);
            var entSetOrdered  = ExpressionMaker.AddOrderBy(entSetFiltered, command.OrderBy);
            var lambdaExpr     = Expression.Lambda(entSetOrdered, prms);

            command.Lambda = lambdaExpr;
        }
Esempio n. 7
0
        public static Expression AddOrderByManyToMany(Expression linkEntSet, EntityInfo linkEnt, EntityMemberInfo targetProp,
                                                      List <EntityKeyMemberInfo> orderBy)
        {
            if (orderBy == null || orderBy.Count == 0)
            {
                return(linkEntSet);
            }
            var entSetOrdered = linkEntSet;

            foreach (var km in orderBy)
            {
                if (km.Member.Entity == linkEnt)
                {
                    entSetOrdered = ExpressionMaker.AddOrderBy(entSetOrdered, km.Member, km.Desc);
                }
                else
                {
                    entSetOrdered = ExpressionMaker.AddOrderBy(entSetOrdered, km.Member, km.Desc, targetProp);
                }
            }
            return(entSetOrdered);
        }
Esempio n. 8
0
        private static void Setup_SelectManyToMany(SpecialLinqCommand command)
        {
            /* Building smth like that:
             * var tuplesQuery = session.EntitySet<IBookAuthor>().Where(ba => ba.Book.Id == csBookId)
             *  .OrderBy(ba => ba.Author.LastName)
             *  .Select(ba => new Data.Linq.LinkTuple() { LinkEntity = ba, TargetEntity = ba.Author });
             *
             * the query returns list of LinkTuple objects <LinkEnt, TargetEnt>
             *
             */
            var listInfo        = command.ListInfoManyToMany;
            var keyParentRef    = listInfo.ParentRefMember.ReferenceInfo.FromKey;
            var prms            = keyParentRef.ExpandedKeyMembers.Select(m => Expression.Parameter(m.Member.DataType, "@" + m.Member.MemberName)).ToArray();
            var wherePred       = ExpressionMaker.MakeKeyPredicate(keyParentRef, prms);
            var linkEntSet      = listInfo.LinkEntity.EntitySetConstant;
            var entSetFiltered  = ExpressionMaker.MakeCallWhere(linkEntSet, wherePred);
            var targetRefMember = listInfo.OtherEntityRefMember;
            var entSetOrdered   = AddOrderByManyToMany(entSetFiltered, listInfo.LinkEntity, listInfo.OtherEntityRefMember, command.OrderBy);
            var newTupleLambda  = ExpressionMaker.MakeNewLinkTupleLambda(listInfo.OtherEntityRefMember);
            var selectTuple     = ExpressionMaker.MakeCallSelect(entSetOrdered, newTupleLambda);

            command.Lambda = Expression.Lambda(selectTuple, prms);
        }