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); }
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); }
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)); }
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; }
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); }
// 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; }
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); }
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); }