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>(); } }
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)); }
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 })); }
internal IEnumerable <TEntity> Execute(IQueryable <TEntity> query, Transaction transaction) { IEnumerable <TEntity> entities = QueryableEx.Execute(query, transaction); return(entities); }