public void CanQueryByInterface()
        {
            Document <AbstractEntity>().With(x => x.Property);
            Document <MoreDerivedEntity1>();
            Document <MoreDerivedEntity2>();

            using (var session = store.OpenSession())
            {
                session.Store(new MoreDerivedEntity1 {
                    Id = NewId(), Property = "Asger"
                });
                session.Store(new MoreDerivedEntity2 {
                    Id = NewId(), Property = "Asger"
                });
                session.SaveChanges();
                session.Advanced.Clear();

                var entities = session.Query <ISomeInterface>().OrderBy(x => QueryableEx.Column <string>(x, "Discriminator")).ToList();
                entities.Count.ShouldBe(2);
                entities[0].ShouldBeOfType <MoreDerivedEntity1>();
                entities[1].ShouldBeOfType <MoreDerivedEntity2>();

                var entities2 = session.Query <IOtherInterface>().OrderBy(x => x.Column <string>("Discriminator")).ToList();
                entities2.Count().ShouldBe(1);
                entities[0].ShouldBeOfType <MoreDerivedEntity1>();
            }
        }
Пример #2
0
        protected override Expression VisitMember(MemberExpression node)
        {
            var declaringType = node.Member.DeclaringType;
            var assembly      = declaringType.Assembly;

            if (assembly != MsCorLib && assembly != Core && node.Member.MemberType == MemberTypes.Property)
            {
                var dict = QueryableEx.Get(declaringType);

                LambdaExpression lambda;

                if (dict != null && dict.TryGetValue((PropertyInfo)node.Member, out lambda))
                {
                    // Anti recursion check
                    if (this.MembersBeingVisited.Contains(node.Member))
                    {
                        throw new Exception(string.Format("Recursively visited member. Chain: {0}", string.Join("->", this.MembersBeingVisited.Concat(new[] { node.Member }).Select(p => p.DeclaringType.Name + "." + p.Name))));
                    }

                    this.MembersBeingVisited.Add(node.Member);

                    // Replace the parameters of the expression with "our" reference
                    var body = new SingleParameterReplacer(lambda.Parameters[0], node.Expression).Visit(lambda.Body);

                    Expression exp = this.Visit(body);

                    this.MembersBeingVisited.RemoveAt(this.MembersBeingVisited.Count - 1);

                    return(exp);
                }
            }

            return(base.VisitMember(node));
        }
Пример #3
0
        public void QueryableRetarget3()
        {
#if NETCOREAPP2_1 || WINDOWS_UWP
            var res = QueryableEx.TakeLast(Enumerable.Range(0, 10).AsQueryable(), 2).AsEnumerable().ToList();
#else
            var res = Enumerable.Range(0, 10).AsQueryable().TakeLast(2).AsEnumerable().ToList();
#endif
            Assert.True(res.SequenceEqual(new[] { 8, 9 }));
        }
Пример #4
0
        internal IEnumerable <TEntity> Execute(IQueryable <TEntity> query, Transaction transaction)
        {
            IEnumerable <TEntity> entities = QueryableEx.Execute(query, transaction);

            return(entities);
        }