linq2db icon indicating copy to clipboard operation
linq2db copied to clipboard

Exception with multiple concat (for UNION ALL)

Open HypeillingerChillinger opened this issue 3 years ago • 1 comments

When concatenating multiple IQueryables an exception occurs

Exception message:
Exception has occurred: CLR/System.InvalidCastException
Ein Ausnahmefehler des Typs "System.InvalidCastException" ist in linq2db.dll aufgetreten.: 'Unable to cast object of type 'System.Linq.Expressions.MemberMemberBinding' to type 'System.Linq.Expressions.MemberAssignment'.'

Stack trace:
Ein Ausnahmefehler des Typs "System.InvalidCastException" ist in linq2db.dll aufgetreten.: 'Unable to cast object of type 'System.Linq.Expressions.MemberMemberBinding' to type 'System.Linq.Expressions.MemberAssignment'.'
   bei System.Runtime.CompilerServices.CastHelpers.ChkCastAny(Void* toTypeHnd, Object obj)
   bei System.Linq.Enumerable.<CastIterator>d__64`1.MoveNext()
   bei System.Collections.Generic.EnumerableHelpers.ToArray[T](IEnumerable`1 source, Int32& length)
   bei System.Linq.Buffer`1..ctor(IEnumerable`1 source)
   bei System.Linq.OrderedEnumerable`1.<GetEnumerator>d__17.MoveNext()
   bei LinqToDB.Linq.Builder.ExpressionBuilder.ProcessProjection(Dictionary`2 members, Expression expression)
   bei LinqToDB.Linq.Builder.SelectContext..ctor(IBuildContext parent, LambdaExpression lambda, IBuildContext[] sequences)
   bei LinqToDB.Linq.Builder.SelectBuilder.BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
   bei LinqToDB.Linq.Builder.MethodCallBuilder.BuildSequence(ExpressionBuilder builder, BuildInfo buildInfo)
   bei LinqToDB.Linq.Builder.ExpressionBuilder.BuildSequence(BuildInfo buildInfo)
   bei LinqToDB.Linq.Builder.WhereBuilder.BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
   bei LinqToDB.Linq.Builder.MethodCallBuilder.BuildSequence(ExpressionBuilder builder, BuildInfo buildInfo)
   bei LinqToDB.Linq.Builder.ExpressionBuilder.BuildSequence(BuildInfo buildInfo)
   bei LinqToDB.Linq.Builder.SelectBuilder.BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
   bei LinqToDB.Linq.Builder.MethodCallBuilder.BuildSequence(ExpressionBuilder builder, BuildInfo buildInfo)
   bei LinqToDB.Linq.Builder.ExpressionBuilder.BuildSequence(BuildInfo buildInfo)
   bei LinqToDB.Linq.Builder.AsSubQueryBuilder.BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
   bei LinqToDB.Linq.Builder.MethodCallBuilder.BuildSequence(ExpressionBuilder builder, BuildInfo buildInfo)
   bei LinqToDB.Linq.Builder.ExpressionBuilder.BuildSequence(BuildInfo buildInfo)
   bei LinqToDB.Linq.Builder.WhereBuilder.BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
   bei LinqToDB.Linq.Builder.MethodCallBuilder.BuildSequence(ExpressionBuilder builder, BuildInfo buildInfo)
   bei LinqToDB.Linq.Builder.ExpressionBuilder.BuildSequence(BuildInfo buildInfo)
   bei LinqToDB.Linq.Builder.SetOperationBuilder.BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
   bei LinqToDB.Linq.Builder.MethodCallBuilder.BuildSequence(ExpressionBuilder builder, BuildInfo buildInfo)
   bei LinqToDB.Linq.Builder.ExpressionBuilder.BuildSequence(BuildInfo buildInfo)
   bei LinqToDB.Linq.Builder.SetOperationBuilder.BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
   bei LinqToDB.Linq.Builder.MethodCallBuilder.BuildSequence(ExpressionBuilder builder, BuildInfo buildInfo)
   bei LinqToDB.Linq.Builder.ExpressionBuilder.BuildSequence(BuildInfo buildInfo)
   bei LinqToDB.Linq.Builder.ExpressionBuilder.Build[T]()
   bei LinqToDB.Linq.Query`1.CreateQuery(IDataContext dataContext, Expression expr)
   bei LinqToDB.Linq.Query`1.GetQuery(IDataContext dataContext, Expression& expr)
   bei LinqToDB.Linq.ExpressionQuery`1.GetQuery(Expression& expression, Boolean cache)
   bei LinqToDB.Linq.ExpressionQuery`1.System.Collections.Generic.IEnumerable<T>.GetEnumerator()
   bei System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   bei System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   bei linq2dbsample.Linq2Db.MultipleConcat.Start()

Steps to reproduce

Occurs also without AsSubQuery()

    public class MyModel
    {
        public long Id { get; set; }
        public DateTime Date { get; set; }
    }

    public class RankData<T>
    {
        public long Rank { get; set; }
        public T Model { get; set; }
    }

    public class MultipleConcat
    {
        public void Start()
        {
            var start = new DateTime(2000, 1, 1);
            var end = new DateTime(2000, 1, 2);
            var context = new DataConnection(new SQLiteDataProvider(ProviderName.SQLiteClassic), "Data Source=:memory:");

            var fluentMappingBuilder = context.MappingSchema.GetFluentMappingBuilder();

            var carBuilder = fluentMappingBuilder.Entity<Car>();
            carBuilder.Property(x => x.Id).IsPrimaryKey();

            var carTable = context.GetTable<Car>();

            var main = (from car in carTable
                        select new RankData<MyModel>
                        {
                            Model = { Id = car.Id, Date = car.DateTime },
                            Rank = Sql.Ext.RowNumber().Over().PartitionBy(car.Id).OrderBy(car.Id).ToValue()
                        }).Where(x => x.Rank == 1).Select(x => x.Model).AsSubQuery();

            var first = main.Where(x => start <= x.Date && x.Date <= end);

            var second = main.Where(x => x.Date < start).OrderByDescending(x => x.Date).Take(1);
            var third = main.Where(x => end < x.Date).OrderBy(x => x.Date).Take(1);

            var res = first.Concat(second).Concat(third).ToList();

            var lastQuery = context.LastQuery;
        }
    }

Environment details

linq2db version: 3.3.0 Database Server: ? Database Provider: ? Operating system: ? .NET Framework: ?

HypeillingerChillinger avatar Apr 12 '21 19:04 HypeillingerChillinger

@sdanyliv sound like something that could be probably fixed with SelectContext refactoring ;)

MaceWindu avatar Apr 16 '21 10:04 MaceWindu