Running the following query
```C#
var cte1 = db.GetTable
.Select(child => new TestWrapper()
{
Child = child
})
.AsCte();
var query = from p in db.Parent
join c in cte1 on p.ParentID equals c.Child.ParentID
select new {p, c};
Exception:
System.ArgumentOutOfRangeException : Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index
at System.ThrowHelper.ThrowArgumentOutOfRange_IndexException()
at System.Collections.Generic.List1.get_Item(Int32 index)
at LinqToDB.Linq.Builder.TableBuilder.TableContext.<>c__DisplayClass44_0.<BuildDefaultConstructor>b__2(<>f__AnonymousType842 idx) in D:\projects\linq2db\Source\LinqToDB\Linq\Builder\TableBuilder.TableContext.cs:line 333
at System.Linq.Enumerable.WhereSelectEnumerableIterator2.MoveNext()
at System.Linq.Enumerable.WhereSelectEnumerableIterator2.ToList()
at System.Linq.Enumerable.ToListTSource in D:\projects\linq2db\Source\LinqToDB\Expressions\Extensions.cs:line 1353
at LinqToDB.Linq.Builder.ExpressionBuilder.BuildExpression(IBuildContext context, Expression expression, Boolean enforceServerSide) in D:\projects\linq2db\Source\LinqToDB\Linq\Builder\ExpressionBuilder.QueryBuilder.cs:line 49
at LinqToDB.Linq.Builder.SelectContext.BuildExpression(Expression expression, Int32 level, Boolean enforceServerSide) in D:\projects\linq2db\Source\LinqToDB\Linq\Builder\SelectContext.cs:line 218
at LinqToDB.Linq.Builder.PassThroughContext.BuildExpression(Expression expression, Int32 level, Boolean enforceServerSide) in D:\projects\linq2db\Source\LinqToDB\Linq\Builder\PassThroughContext.cs:line 36
at LinqToDB.Linq.Builder.SelectContext.BuildExpression(Expression expression, Int32 level, Boolean enforceServerSide) in D:\projects\linq2db\Source\LinqToDB\Linq\Builder\SelectContext.cs:line 151
at LinqToDB.Linq.Builder.ExpressionBuilder.TransformExpression(IBuildContext context, Expression expr, Boolean enforceServerSide) in D:\projects\linq2db\Source\LinqToDB\Linq\Builder\ExpressionBuilder.QueryBuilder.cs:line 139
at LinqToDB.Linq.Builder.ExpressionBuilder.<>c__DisplayClass74_0.
at LinqToDB.Expressions.Extensions.Transform(Expression expr, Func2 func) in D:\projects\linq2db\Source\LinqToDB\Expressions\Extensions.cs:line 1353
at LinqToDB.Expressions.Extensions.Transform2[T](IEnumerable1 source, Func2 func) in D:\projects\linq2db\Source\LinqToDB\Expressions\Extensions.cs:line 1337
at LinqToDB.Expressions.Extensions.Transform(Expression expr, Func2 func) in D:\projects\linq2db\Source\LinqToDB\Expressions\Extensions.cs:line 1554
at LinqToDB.Linq.Builder.ExpressionBuilder.BuildExpression(IBuildContext context, Expression expression, Boolean enforceServerSide) in D:\projects\linq2db\Source\LinqToDB\Linq\Builder\ExpressionBuilder.QueryBuilder.cs:line 49
at LinqToDB.Linq.Builder.SelectContext.BuildExpression(Expression expression, Int32 level, Boolean enforceServerSide) in D:\projects\linq2db\Source\LinqToDB\Linq\Builder\SelectContext.cs:line 114
at LinqToDB.Linq.Builder.SelectContext.BuildQuery[T](Query1 query, ParameterExpression queryParameter) in D:\projects\linq2db\Source\LinqToDB\Linq\Builder\SelectContext.cs:line 65
at LinqToDB.Linq.Builder.ExpressionBuilder.Build[T]() in D:\projects\linq2db\Source\LinqToDB\Linq\Builder\ExpressionBuilder.cs:line 159
at LinqToDB.Linq.Query1.CreateQuery(IDataContext dataContext, Expression expr) in D:\projects\linq2db\Source\LinqToDB\Linq\Query.cs:line 280
at LinqToDB.Linq.Query1.GetQuery(IDataContext dataContext, Expression& expr) in D:\projects\linq2db\Source\LinqToDB\Linq\Query.cs:line 233
at LinqToDB.Linq.ExpressionQuery1.GetQuery(Expression& expression, Boolean cache) in D:\projects\linq2db\Source\LinqToDB\Linq\ExpressionQuery.cs:line 79
at LinqToDB.Linq.ExpressionQuery1.System.Collections.Generic.IEnumerable<T>.GetEnumerator() in D:\projects\linq2db\Source\LinqToDB\Linq\ExpressionQuery.cs:line 180
at System.Linq.Enumerable.SelectEnumerableIterator2.ToList()
at System.Linq.Enumerable.ToListTSource in D:\projects\linq2db\Tests\Base\TestBase.cs:line 909
at Tests.Linq.CteTests.TestWithWrapper(String context) in D:\projects\linq2db\Tests\Linq\Linq\CteTests.cs:line 820
### Steps to reproduce
Run the following test
```c#
[Test]
public void TestWithWrapper([CteContextSource] string context)
{
using (var db = GetDataContext(context))
{
var cte1 = db.GetTable<Child>()
.Select(child => new TestWrapper()
{
Child = child
})
.AsCte();
var query = from p in db.Parent
join c in cte1 on p.ParentID equals c.Child.ParentID
select new {p, c};
var cte1_ = db.GetTable<Child>()
.Select(child => new TestWrapper()
{
Child = child
});
var expected =
from p in db.Parent
join c in cte1_ on p.ParentID equals c.Child.ParentID
select new {p, c};
AreEqual(expected, query);
}
}
private class TestWrapper
{
public Child Child { get; set; }
}
linq2db version: Current master 16f7f48621e509bcb5740be0c418c8ff295122df
Operating system: E.g. Windows 10
Framework version: .NET Core 2.0
Thanks for detailed bug report. Will handle this.
Thanks! There's actually another issue that may or may not be related (it only happens with a wrapper and CTE). Should I make this into a separate issue?
System.InvalidOperationException : Operation is not valid due to the current state of the object.
at LinqToDB.Expressions.InternalExtensions.GetLevelExpression(Expression expression, MappingSchema mapping, Int32 level) in D:\projects\linq2db\Source\LinqToDB\Expressions\InternalExtensions.cs:line 1039
at LinqToDB.Linq.Builder.ConcatUnionBuilder.UnionContext.BuildExpression(Expression expression, Int32 level, Boolean enforceServerSide) in D:\projects\linq2db\Source\LinqToDB\Linq\Builder\ConcatUnionBuilder.cs:line 250
at LinqToDB.Linq.Builder.ExpressionBuilder.TransformExpression(IBuildContext context, Expression expr, Boolean enforceServerSide) in D:\projects\linq2db\Source\LinqToDB\Linq\Builder\ExpressionBuilder.QueryBuilder.cs:line 185
at LinqToDB.Linq.Builder.ExpressionBuilder.<>c__DisplayClass74_0.<BuildExpression>b__0(Expression expr) in D:\projects\linq2db\Source\LinqToDB\Linq\Builder\ExpressionBuilder.QueryBuilder.cs:line 49
at LinqToDB.Expressions.Extensions.Transform(Expression expr, Func`2 func) in D:\projects\linq2db\Source\LinqToDB\Expressions\Extensions.cs:line 1353
at LinqToDB.Expressions.Extensions.Transform(Expression expr, Func`2 func) in D:\projects\linq2db\Source\LinqToDB\Expressions\Extensions.cs:line 1487
at LinqToDB.Expressions.Extensions.<>c__DisplayClass34_0.<Transform>g__Modify|1(MemberBinding b) in D:\projects\linq2db\Source\LinqToDB\Expressions\Extensions.cs:line 1501
at LinqToDB.Expressions.Extensions.Transform2[T](ICollection`1 source, Func`2 func) in D:\projects\linq2db\Source\LinqToDB\Expressions\Extensions.cs:line 1321
at LinqToDB.Expressions.Extensions.Transform(Expression expr, Func`2 func) in D:\projects\linq2db\Source\LinqToDB\Expressions\Extensions.cs:line 1546
at LinqToDB.Linq.Builder.ExpressionBuilder.BuildExpression(IBuildContext context, Expression expression, Boolean enforceServerSide) in D:\projects\linq2db\Source\LinqToDB\Linq\Builder\ExpressionBuilder.QueryBuilder.cs:line 49
at LinqToDB.Linq.Builder.ConcatUnionBuilder.UnionContext.BuildExpression(Expression expression, Int32 level, Boolean enforceServerSide) in D:\projects\linq2db\Source\LinqToDB\Linq\Builder\ConcatUnionBuilder.cs:line 238
at LinqToDB.Linq.Builder.ConcatUnionBuilder.UnionContext.BuildQuery[T](Query`1 query, ParameterExpression queryParameter) in D:\projects\linq2db\Source\LinqToDB\Linq\Builder\ConcatUnionBuilder.cs:line 197
at LinqToDB.Linq.Builder.ExpressionBuilder.Build[T]() in D:\projects\linq2db\Source\LinqToDB\Linq\Builder\ExpressionBuilder.cs:line 159
at LinqToDB.Linq.Query`1.CreateQuery(IDataContext dataContext, Expression expr) in D:\projects\linq2db\Source\LinqToDB\Linq\Query.cs:line 280
at LinqToDB.Linq.Query`1.GetQuery(IDataContext dataContext, Expression& expr) in D:\projects\linq2db\Source\LinqToDB\Linq\Query.cs:line 233
at LinqToDB.Linq.ExpressionQuery`1.GetQuery(Expression& expression, Boolean cache) in D:\projects\linq2db\Source\LinqToDB\Linq\ExpressionQuery.cs:line 79
at LinqToDB.Linq.ExpressionQuery`1.System.Collections.Generic.IEnumerable<T>.GetEnumerator() in D:\projects\linq2db\Source\LinqToDB\Linq\ExpressionQuery.cs:line 180
at System.Linq.Enumerable.SelectEnumerableIterator`2.ToList()
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
at Tests.TestBase.AreEqual[T](Func`2 fixSelector, IEnumerable`1 expected, IEnumerable`1 result, IEqualityComparer`1 comparer) in D:\projects\linq2db\Tests\Base\TestBase.cs:line 924
at Tests.TestBase.AreEqual[T](IEnumerable`1 expected, IEnumerable`1 result) in D:\projects\linq2db\Tests\Base\TestBase.cs:line 909
at Tests.Linq.CteTests.TestWithWrapper(String context) in D:\projects\linq2db\Tests\Linq\Linq\CteTests.cs:line 817
C#
var cte1 = db.GetTable<Child>()
.Select(child => new TestWrapper()
{
Child = child
})
.AsCte();
var query1 = db.Child.Select(child => new TestWrapper() {Child = child});
var query = query1.Union(cte1);
No, thanks. Will handle them together.
Closed by #1440