linq2db
linq2db copied to clipboard
Exception with multiple concat (for UNION ALL)
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: ?
@sdanyliv sound like something that could be probably fixed with SelectContext
refactoring ;)