Search code examples
c#linq2dblinqkit

linq2db - exception is thrown when using Lead function


We are using .NET Core 3.1, Microsoft.EntityFrameworkCore 3.1.9, Npgsql 4.1.9, LinqKit.Microsoft.EntityFrameworkCore 3.2.3 and linq2db.EntityFrameworkCore 3.7.0.

We have the following 2 scaffolded classes:

[Table("testrunconfig", Schema = "fit")]
public partial class Testrunconfig
{
    public Testrunconfig()
    {
        Testruntestgrp = new HashSet<Testruntestgrp>();
    }
    
    [Key]
    [Column("id")]
    public int Id { get; set; }
    
    [InverseProperty("Testrunconfig")]
    public virtual ICollection<Testruntestgrp> Testruntestgrp { get; set; }
}

[Table("testruntestgrp", Schema = "fit")]
public partial class Testruntestgrp
{
    [Key]
    [Column("id")]
    public int Id { get; set; }
    
    [Column("testname")]
    public string Testname { get; set; }
    
    [Column("status")]
    public string Status { get; set; }

    [ForeignKey(nameof(TestrunconfigId))]
    [InverseProperty("Testruntestgrp")]
    public virtual Testrunconfig Testrunconfig { get; set; }
}

We enabled linq2db logging like this:

private void ConfigureLinq2DbConsoleLogging()
{
    DataConnection.TurnTraceSwitchOn();
    DataConnection.WriteTraceLine = (string s1, string s2, TraceLevel _) => Debug.WriteLine($"{s1}: {s2}");
}

We have a query where we need both LinqKit (to invoke DetermineFinalResultForTestFunc) and linq2db (to use SQL window function LEAD):

private readonly static Expression<Func<Testrunconfig, string, string>> DetermineFinalResultForTestFunc =
    (Testrunconfig trc, string testName) =>
        trc == null ?
            null :
            (trc.Finished == null ?
                "IN_PROGRESS" :
                (trc.Testruntestgrp == null || trc.Testruntestgrp.Any(x => x.Testname == testName && x.Status != "OK") ?
                    "ERROR" :
                    "OK")
                );

public void GetTestBisectedExecutions(string testName)
{
    var result = _fitDbContext.Testrunconfig
        .AsExpandable()
        .Include(x => x.Testruntestgrp)
        .Where(x => x.Testruntestgrp.Any(y => y.Testname == testName))
        .OrderByDescending(x => x.Id)
        .Select(x => new TestExecutionHelper()
        {
            TestrunConfig = x,
            SelectedTestName = testName,
            FinalResultSelectedTest = DetermineFinalResultForTestFunc.Invoke(x, testName)
        })
        .Where(x => Sql.Ext.Lead(x.FinalResultSelectedTest, Sql.Nulls.Respect)
            .Over()
            .OrderByDesc(x.TestrunConfig.Id)
            .ToValue() != x.FinalResultSelectedTest
        )
        .ToLinqToDB()
        .ToList();
}

What are we trying to do with this query? The final .Where(...) with Sql.Ext.Lead keeps just the last item in each sequence of the same FinalResultSelectedTest values. Example (before this Where):

TestrunConfig.Id FinalResultSelectedTest
7 WARNING
6 OK
5 OK
4 ERROR
3 ERROR
2 OK
1 OK

Example (after this Where):

TestrunConfig.Id FinalResultSelectedTest
7 WARNING
5 OK
3 ERROR
1 OK

However, when we execute this query, the following exception is thrown. If I remove Where() with Lead, there is no exception:

Exception thrown: 'System.NullReferenceException' in linq2db.dll
Object reference not set to an instance of an object.

The thread 0xad6c has exited with code 0 (0x0).
The thread 0x5244 has exited with code 0 (0x0).
Exception thrown: 'System.Reflection.TargetInvocationException' in System.Private.CoreLib.dll
To generate test code to diagnose the problem set 'LinqToDB.Common.Configuration.Linq.GenerateExpressionTest = true'.: DataConnection
Exception thrown: 'System.Reflection.TargetInvocationException' in linq2db.dll
Exception thrown: 'System.Reflection.TargetInvocationException' in System.Private.CoreLib.dll
Exception thrown: 'System.Reflection.TargetInvocationException' in System.Private.CoreLib.dll
Exception thrown: 'System.Reflection.TargetInvocationException' in System.Private.CoreLib.dll
Exception thrown: 'System.Reflection.TargetInvocationException' in System.Private.CoreLib.dll
Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker: Information: Executed action MyProject.Web.Controllers.TestExecutions.TestExecutionsController.IndexAlternate (MyProject.Web) in 18729.8556ms
Exception thrown: 'System.Reflection.TargetInvocationException' in System.Private.CoreLib.dll
Microsoft.AspNetCore.Routing.EndpointMiddleware: Information: Executed endpoint 'MyProject.Web.Controllers.TestExecutions.TestExecutionsController.IndexAlternate (MyProject.Web)'
Exception thrown: 'System.Reflection.TargetInvocationException' in System.Private.CoreLib.dll
Exception thrown: 'System.Reflection.TargetInvocationException' in System.Private.CoreLib.dll
Exception thrown: 'System.Reflection.TargetInvocationException' in System.Private.CoreLib.dll
Exception thrown: 'System.Reflection.TargetInvocationException' in System.Private.CoreLib.dll
Exception thrown: 'System.Reflection.TargetInvocationException' in System.Private.CoreLib.dll
Exception thrown: 'System.Reflection.TargetInvocationException' in System.Private.CoreLib.dll
Exception thrown: 'System.Reflection.TargetInvocationException' in System.Private.CoreLib.dll
'iisexpress.exe' (CoreCLR: clrhost): Loaded 'C:\Program Files\dotnet\shared\Microsoft.NETCore.App\3.1.32\System.Diagnostics.StackTrace.dll'. 
'iisexpress.exe' (CoreCLR: clrhost): Loaded 'C:\Program Files\dotnet\shared\Microsoft.NETCore.App\3.1.32\System.Reflection.Metadata.dll'. 
'iisexpress.exe' (CoreCLR: clrhost): Loaded 'C:\Program Files\dotnet\shared\Microsoft.NETCore.App\3.1.32\System.IO.MemoryMappedFiles.dll'. 
Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware: Error: An unhandled exception has occurred while executing the request.

System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation.
 ---> System.NullReferenceException: Object reference not set to an instance of an object.
   at LinqToDB.Linq.Builder.EagerLoading.<>c__DisplayClass48_0.<ReplaceParametersWithChangedType>b__0(Expression b)
   at LinqToDB.Expressions.Extensions.Transform(Expression expr, Func`2 func)
   at LinqToDB.Expressions.Extensions.Transform[T](ICollection`1 source, Func`2 func)
   at LinqToDB.Expressions.Extensions.TransformX(MethodCallExpression e, Func`2 func)
   at LinqToDB.Expressions.Extensions.Transform(Expression expr, Func`2 func)
   at LinqToDB.Expressions.Extensions.TransformX(MethodCallExpression e, Func`2 func)
   at LinqToDB.Expressions.Extensions.Transform(Expression expr, Func`2 func)
   at LinqToDB.Expressions.Extensions.TransformX(MethodCallExpression e, Func`2 func)
   at LinqToDB.Expressions.Extensions.Transform(Expression expr, Func`2 func)
   at LinqToDB.Expressions.Extensions.TransformX(MethodCallExpression e, Func`2 func)
   at LinqToDB.Expressions.Extensions.Transform(Expression expr, Func`2 func)
   at LinqToDB.Expressions.Extensions.TransformX(BinaryExpression e, Func`2 func)
   at LinqToDB.Expressions.Extensions.Transform(Expression expr, Func`2 func)
   at LinqToDB.Linq.Builder.EagerLoading.ReplaceParametersWithChangedType(Expression body, IList`1 before, IList`1 after)
   at LinqToDB.Linq.Builder.EagerLoading.<>c.<FinalizeExpressionKeys>b__49_0(Expression e)
   at LinqToDB.Expressions.Extensions.Transform(Expression expr, Func`2 func)
   at LinqToDB.Expressions.Extensions.TransformX(UnaryExpression e, Func`2 func)
   at LinqToDB.Expressions.Extensions.Transform(Expression expr, Func`2 func)
   at LinqToDB.Linq.Builder.EagerLoading.FinalizeExpressionKeys(Expression expr)
   at LinqToDB.Linq.Builder.EagerLoading.<>c__DisplayClass49_1.<FinalizeExpressionKeys>b__2(Expression a)
   at System.Linq.Enumerable.SelectIListIterator`2.ToArray()
   at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
   at LinqToDB.Linq.Builder.EagerLoading.<>c.<FinalizeExpressionKeys>b__49_0(Expression e)
   at LinqToDB.Expressions.Extensions.Transform(Expression expr, Func`2 func)
   at LinqToDB.Linq.Builder.EagerLoading.FinalizeExpressionKeys(Expression expr)
   at LinqToDB.Linq.Builder.EagerLoading.<>c__DisplayClass49_1.<FinalizeExpressionKeys>b__2(Expression a)
   at System.Linq.Enumerable.SelectIListIterator`2.ToArray()
   at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
   at LinqToDB.Linq.Builder.EagerLoading.<>c.<FinalizeExpressionKeys>b__49_0(Expression e)
   at LinqToDB.Expressions.Extensions.Transform(Expression expr, Func`2 func)
   at LinqToDB.Linq.Builder.EagerLoading.FinalizeExpressionKeys(Expression expr)
   at LinqToDB.Linq.Builder.EagerLoading.<>c__DisplayClass49_1.<FinalizeExpressionKeys>b__2(Expression a)
   at System.Linq.Enumerable.SelectIListIterator`2.ToArray()
   at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
   at LinqToDB.Linq.Builder.EagerLoading.<>c.<FinalizeExpressionKeys>b__49_0(Expression e)
   at LinqToDB.Expressions.Extensions.Transform(Expression expr, Func`2 func)
   at LinqToDB.Linq.Builder.EagerLoading.FinalizeExpressionKeys(Expression expr)
   at LinqToDB.Linq.Builder.EagerLoading.<>c__DisplayClass49_1.<FinalizeExpressionKeys>b__2(Expression a)
   at System.Linq.Enumerable.SelectIListIterator`2.ToArray()
   at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
   at LinqToDB.Linq.Builder.EagerLoading.<>c.<FinalizeExpressionKeys>b__49_0(Expression e)
   at LinqToDB.Expressions.Extensions.Transform(Expression expr, Func`2 func)
   at LinqToDB.Linq.Builder.EagerLoading.FinalizeExpressionKeys(Expression expr)
   at LinqToDB.Linq.Builder.EagerLoading.RegisterPreambles[TD,TKey](ExpressionBuilder builder, IQueryable`1 detailQuery)
   at LinqToDB.Linq.Builder.EagerLoading.EnlistEagerLoadingFunctionality[T,TD,TKey](ExpressionBuilder builder, Expression mainQueryExpr, Expression`1 detailQueryLambda, Expression compiledKeyExpression, Expression`1 selectKeyExpression)
   --- End of inner exception stack trace ---
Exception thrown: 'System.NotImplementedException' in System.Private.CoreLib.dll
Exception thrown: 'System.NotImplementedException' in System.Private.CoreLib.dll
Microsoft.AspNetCore.Hosting.Diagnostics: Information: Request finished in 19635.7644ms 500 text/html; charset=utf-8

Update

I modified the query as suggested by Svyatoslav Danyliv. This is the query that I have now:

var result = _fitDbContext.Testrunconfig
    //.Include(x => x.Testruntestgrp)
    .Where(x => x.Testruntestgrp.Any(y => y.Testname == testName))
    .OrderByDescending(x => x.Id)
    .Select(x => new TestExecutionHelper()
    {
        TestrunConfig = x,
        SelectedTestName = testName,
        FinalResultSelectedTest = DetermineFinalResultForTestFunc.Compile()(x, testName)
    })
    .Select(x => new
    {
        Helper = x,
        NextVal = Sql.Ext.Lead(x.FinalResultSelectedTest, Sql.Nulls.Respect)
            .Over()
            .OrderByDesc(x.TestrunConfig.Id)
            .ToValue()
    })
    .Where(x => x.NextVal != x.Helper.FinalResultSelectedTest)
    .Select(x => x.Helper)
    .ToLinqToDB()
    .ToList();

However, it still throws an exception:

Exception thrown: 'System.NullReferenceException' in linq2db.dll
Object reference not set to an instance of an object.

Exception thrown: 'System.Reflection.TargetInvocationException' in System.Private.CoreLib.dll
To generate test code to diagnose the problem set 'LinqToDB.Common.Configuration.Linq.GenerateExpressionTest = true'.: DataConnection
Exception thrown: 'System.Reflection.TargetInvocationException' in linq2db.dll
Exception thrown: 'System.Reflection.TargetInvocationException' in System.Private.CoreLib.dll
Exception thrown: 'System.Reflection.TargetInvocationException' in System.Private.CoreLib.dll
Exception thrown: 'System.Reflection.TargetInvocationException' in System.Private.CoreLib.dll
Exception thrown: 'System.Reflection.TargetInvocationException' in System.Private.CoreLib.dll
Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker: Information: Executed action MyProject.Web.Controllers.TestExecutions.TestExecutionsController.IndexAlternate (MyProject.Web) in 14310.6779ms
Exception thrown: 'System.Reflection.TargetInvocationException' in System.Private.CoreLib.dll
Microsoft.AspNetCore.Routing.EndpointMiddleware: Information: Executed endpoint 'MyProject.Web.Controllers.TestExecutions.TestExecutionsController.IndexAlternate (MyProject.Web)'
Exception thrown: 'System.Reflection.TargetInvocationException' in System.Private.CoreLib.dll
Exception thrown: 'System.Reflection.TargetInvocationException' in System.Private.CoreLib.dll
Exception thrown: 'System.Reflection.TargetInvocationException' in System.Private.CoreLib.dll
Exception thrown: 'System.Reflection.TargetInvocationException' in System.Private.CoreLib.dll
Exception thrown: 'System.Reflection.TargetInvocationException' in System.Private.CoreLib.dll
Exception thrown: 'System.Reflection.TargetInvocationException' in System.Private.CoreLib.dll
Exception thrown: 'System.Reflection.TargetInvocationException' in System.Private.CoreLib.dll
'iisexpress.exe' (CoreCLR: clrhost): Loaded 'C:\Program Files\dotnet\shared\Microsoft.NETCore.App\3.1.32\System.Diagnostics.StackTrace.dll'. 
'iisexpress.exe' (CoreCLR: clrhost): Loaded 'C:\Program Files\dotnet\shared\Microsoft.NETCore.App\3.1.32\System.Reflection.Metadata.dll'. 
'iisexpress.exe' (CoreCLR: clrhost): Loaded 'C:\Program Files\dotnet\shared\Microsoft.NETCore.App\3.1.32\System.IO.MemoryMappedFiles.dll'. 
Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware: Error: An unhandled exception has occurred while executing the request.

System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation.
 ---> System.NullReferenceException: Object reference not set to an instance of an object.
   at LinqToDB.Linq.Builder.EagerLoading.<>c__DisplayClass48_0.<ReplaceParametersWithChangedType>b__0(Expression b)
   at LinqToDB.Expressions.Extensions.Transform(Expression expr, Func`2 func)
   at LinqToDB.Expressions.Extensions.Transform[T](ICollection`1 source, Func`2 func)
   at LinqToDB.Expressions.Extensions.TransformX(MethodCallExpression e, Func`2 func)
   at LinqToDB.Expressions.Extensions.Transform(Expression expr, Func`2 func)
   at LinqToDB.Expressions.Extensions.TransformX(MethodCallExpression e, Func`2 func)
   at LinqToDB.Expressions.Extensions.Transform(Expression expr, Func`2 func)
   at LinqToDB.Expressions.Extensions.TransformX(MethodCallExpression e, Func`2 func)
   at LinqToDB.Expressions.Extensions.Transform(Expression expr, Func`2 func)
   at LinqToDB.Expressions.Extensions.TransformX(MethodCallExpression e, Func`2 func)
   at LinqToDB.Expressions.Extensions.Transform(Expression expr, Func`2 func)
   at LinqToDB.Expressions.Extensions.Transform[T](ICollection`1 source, Func`2 func)
   at LinqToDB.Expressions.Extensions.Transform(Expression expr, Func`2 func)
   at LinqToDB.Expressions.Extensions.<>c__DisplayClass27_0.<TransformX>g__Modify|0(MemberBinding b)
   at LinqToDB.Expressions.Extensions.Transform[T](ICollection`1 source, Func`2 func)
   at LinqToDB.Expressions.Extensions.TransformX(MemberInitExpression e, Func`2 func)
   at LinqToDB.Expressions.Extensions.Transform(Expression expr, Func`2 func)
   at LinqToDB.Linq.Builder.EagerLoading.ReplaceParametersWithChangedType(Expression body, IList`1 before, IList`1 after)
   at LinqToDB.Linq.Builder.EagerLoading.<>c.<FinalizeExpressionKeys>b__49_0(Expression e)
   at LinqToDB.Expressions.Extensions.Transform(Expression expr, Func`2 func)
   at LinqToDB.Expressions.Extensions.TransformX(UnaryExpression e, Func`2 func)
   at LinqToDB.Expressions.Extensions.Transform(Expression expr, Func`2 func)
   at LinqToDB.Linq.Builder.EagerLoading.FinalizeExpressionKeys(Expression expr)
   at LinqToDB.Linq.Builder.EagerLoading.<>c__DisplayClass49_1.<FinalizeExpressionKeys>b__2(Expression a)
   at System.Linq.Enumerable.SelectIListIterator`2.ToArray()
   at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
   at LinqToDB.Linq.Builder.EagerLoading.<>c.<FinalizeExpressionKeys>b__49_0(Expression e)
   at LinqToDB.Expressions.Extensions.Transform(Expression expr, Func`2 func)
   at LinqToDB.Linq.Builder.EagerLoading.FinalizeExpressionKeys(Expression expr)
   at LinqToDB.Linq.Builder.EagerLoading.<>c__DisplayClass49_1.<FinalizeExpressionKeys>b__2(Expression a)
   at System.Linq.Enumerable.SelectIListIterator`2.ToArray()
   at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
   at LinqToDB.Linq.Builder.EagerLoading.<>c.<FinalizeExpressionKeys>b__49_0(Expression e)
   at LinqToDB.Expressions.Extensions.Transform(Expression expr, Func`2 func)
   at LinqToDB.Linq.Builder.EagerLoading.FinalizeExpressionKeys(Expression expr)
   at LinqToDB.Linq.Builder.EagerLoading.<>c__DisplayClass49_1.<FinalizeExpressionKeys>b__2(Expression a)
   at System.Linq.Enumerable.SelectIListIterator`2.ToArray()
   at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
   at LinqToDB.Linq.Builder.EagerLoading.<>c.<FinalizeExpressionKeys>b__49_0(Expression e)
   at LinqToDB.Expressions.Extensions.Transform(Expression expr, Func`2 func)
   at LinqToDB.Linq.Builder.EagerLoading.FinalizeExpressionKeys(Expression expr)
   at LinqToDB.Linq.Builder.EagerLoading.<>c__DisplayClass49_1.<FinalizeExpressionKeys>b__2(Expression a)
   at System.Linq.Enumerable.SelectIListIterator`2.ToArray()
   at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
   at LinqToDB.Linq.Builder.EagerLoading.<>c.<FinalizeExpressionKeys>b__49_0(Expression e)
   at LinqToDB.Expressions.Extensions.Transform(Expression expr, Func`2 func)
   at LinqToDB.Linq.Builder.EagerLoading.FinalizeExpressionKeys(Expression expr)
   at LinqToDB.Linq.Builder.EagerLoading.<>c__DisplayClass49_1.<FinalizeExpressionKeys>b__2(Expression a)
   at System.Linq.Enumerable.SelectIListIterator`2.ToArray()
   at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
   at LinqToDB.Linq.Builder.EagerLoading.<>c.<FinalizeExpressionKeys>b__49_0(Expression e)
   at LinqToDB.Expressions.Extensions.Transform(Expression expr, Func`2 func)
   at LinqToDB.Linq.Builder.EagerLoading.FinalizeExpressionKeys(Expression expr)
   at LinqToDB.Linq.Builder.EagerLoading.<>c__DisplayClass49_1.<FinalizeExpressionKeys>b__2(Expression a)
   at System.Linq.Enumerable.SelectIListIterator`2.ToArray()
   at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
   at LinqToDB.Linq.Builder.EagerLoading.<>c.<FinalizeExpressionKeys>b__49_0(Expression e)
   at LinqToDB.Expressions.Extensions.Transform(Expression expr, Func`2 func)
   at LinqToDB.Linq.Builder.EagerLoading.FinalizeExpressionKeys(Expression expr)
   at LinqToDB.Linq.Builder.EagerLoading.RegisterPreambles[TD,TKey](ExpressionBuilder builder, IQueryable`1 detailQuery)
   at LinqToDB.Linq.Builder.EagerLoading.EnlistEagerLoadingFunctionality[T,TD,TKey](ExpressionBuilder builder, Expression mainQueryExpr, Expression`1 detailQueryLambda, Expression compiledKeyExpression, Expression`1 selectKeyExpression)
   --- End of inner exception stack trace ---
   at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor, Boolean wrapExceptions)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   at LinqToDB.Linq.Builder.EagerLoading.GenerateDetailsExpression(IBuildContext context, MappingSchema mappingSchema, Expression expression)
   at LinqToDB.Linq.Builder.ExpressionBuilder.GetMultipleQueryExpression(IBuildContext context, MappingSchema mappingSchema, Expression expression, HashSet`1 parameters, Boolean& isLazy)
   at LinqToDB.Linq.Builder.ExpressionBuilder.BuildMultipleQuery(IBuildContext context, Expression expression, Boolean enforceServerSide)
   at LinqToDB.Linq.Builder.TableBuilder.TableContext.BuildExpression(Expression expression, Int32 level, ParameterExpression parentObject)
   at LinqToDB.Linq.Builder.TableBuilder.TableContext.BuildExpression(Expression expression, Int32 level, Boolean enforceServerSide)
   at LinqToDB.Linq.Builder.SelectContext.BuildExpression(Expression expression, Int32 level, Boolean enforceServerSide)
   at LinqToDB.Linq.Builder.ExpressionBuilder.TransformExpression(IBuildContext context, Expression expr, Boolean enforceServerSide, String alias)
   at LinqToDB.Linq.Builder.ExpressionBuilder.<>c__DisplayClass79_0.<BuildExpression>b__0(Expression expr)
   at LinqToDB.Expressions.Extensions.Transform(Expression expr, Func`2 func)
   at LinqToDB.Expressions.Extensions.Transform(Expression expr, Func`2 func)
   at LinqToDB.Expressions.Extensions.Transform(Expression expr, Func`2 func)
   at LinqToDB.Expressions.Extensions.Transform(Expression expr, Func`2 func)
   at LinqToDB.Expressions.Extensions.Transform(Expression expr, Func`2 func)
   at LinqToDB.Linq.Builder.ExpressionBuilder.BuildExpression(IBuildContext context, Expression expression, Boolean enforceServerSide, String alias)
   at LinqToDB.Linq.Builder.ExpressionBuilder.CorrectConditional(IBuildContext context, Expression expr, Boolean enforceServerSide, String alias)
   at LinqToDB.Linq.Builder.ExpressionBuilder.CorrectConditional(IBuildContext context, Expression expr, Boolean enforceServerSide, String alias)
   at LinqToDB.Linq.Builder.ExpressionBuilder.ConvertAssignmentArgument(IBuildContext context, Expression expr, MemberInfo memberInfo, Boolean enforceServerSide, String alias)
   at LinqToDB.Linq.Builder.ExpressionBuilder.TransformExpression(IBuildContext context, Expression expr, Boolean enforceServerSide, String alias)
   at LinqToDB.Linq.Builder.ExpressionBuilder.<>c__DisplayClass79_0.<BuildExpression>b__0(Expression expr)
   at LinqToDB.Expressions.Extensions.Transform(Expression expr, Func`2 func)
   at LinqToDB.Linq.Builder.ExpressionBuilder.BuildExpression(IBuildContext context, Expression expression, Boolean enforceServerSide, String alias)
   at LinqToDB.Linq.Builder.SelectContext.BuildExpression(Expression expression, Int32 level, Boolean enforceServerSide)
   at LinqToDB.Linq.Builder.SelectContext.BuildExpression(Expression expression, Int32 level, Boolean enforceServerSide)
   at LinqToDB.Linq.Builder.ExpressionBuilder.TransformExpression(IBuildContext context, Expression expr, Boolean enforceServerSide, String alias)
   at LinqToDB.Linq.Builder.ExpressionBuilder.<>c__DisplayClass79_0.<BuildExpression>b__0(Expression expr)
   at LinqToDB.Expressions.Extensions.Transform(Expression expr, Func`2 func)
   at LinqToDB.Linq.Builder.ExpressionBuilder.BuildExpression(IBuildContext context, Expression expression, Boolean enforceServerSide, String alias)
   at LinqToDB.Linq.Builder.SelectContext.BuildExpression(Expression expression, Int32 level, Boolean enforceServerSide)
   at LinqToDB.Linq.Builder.PassThroughContext.BuildExpression(Expression expression, Int32 level, Boolean enforceServerSide)
   at LinqToDB.Linq.Builder.SelectContext.<>c__DisplayClass40_0.<BuildExpression>b__0(IBuildContext ctx, Expression ex, Int32 l)
   at LinqToDB.Linq.Builder.SelectContext.ProcessScalar[T](Expression expression, Int32 level, Func`4 action, Func`1 defaultAction, Boolean throwOnError)
   at LinqToDB.Linq.Builder.SelectContext.BuildExpression(Expression expression, Int32 level, Boolean enforceServerSide)
   at LinqToDB.Linq.Builder.ExpressionBuilder.TransformExpression(IBuildContext context, Expression expr, Boolean enforceServerSide, String alias)
   at LinqToDB.Linq.Builder.ExpressionBuilder.<>c__DisplayClass79_0.<BuildExpression>b__0(Expression expr)
   at LinqToDB.Expressions.Extensions.Transform(Expression expr, Func`2 func)
   at LinqToDB.Linq.Builder.ExpressionBuilder.BuildExpression(IBuildContext context, Expression expression, Boolean enforceServerSide, String alias)
   at LinqToDB.Linq.Builder.SelectContext.BuildExpression(Expression expression, Int32 level, Boolean enforceServerSide)
   at LinqToDB.Linq.Builder.SelectContext.BuildQuery[T](Query`1 query, ParameterExpression queryParameter)
   at LinqToDB.Linq.Builder.ExpressionBuilder.Build[T]()
   at LinqToDB.Linq.Query`1.CreateQuery(IDataContext dataContext, Expression expr)
   at LinqToDB.Linq.Query`1.GetQuery(IDataContext dataContext, Expression& expr)
   at LinqToDB.Linq.ExpressionQuery`1.GetQuery(Expression& expression, Boolean cache)
   at LinqToDB.Linq.ExpressionQuery`1.System.Collections.Generic.IEnumerable<T>.GetEnumerator()
   at LinqToDB.EntityFrameworkCore.Internal.LinqToDBForEFQueryProvider`1.System.Collections.Generic.IEnumerable<T>.GetEnumerator()
   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   at MyProject.Service.TestExecutionsService.GetTestBisectedExecutions(String configuration, Int32 maxTransitions, String testName, String svnRevision) in E:\MyDevCheckouts\AsystSupportDB\MyProject_trunk\MyProject.Service\TestExecutionsService.cs:line 56
   at MyProject.Web.Controllers.TestExecutions.TestExecutionsController.IndexAlternate(BisectExecutionsGuiModel model) in E:\MyDevCheckouts\AsystSupportDB\MyProject_trunk\MyProject.web\Controllers\TestExecutions\TestExecutionsController.cs:line 98
   at lambda_method(Closure , Object , Object[] )
   at Microsoft.Extensions.Internal.ObjectMethodExecutor.Execute(Object target, Object[] parameters)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.SyncActionResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeActionMethodAsync()
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeNextActionFilterAsync()
--- End of stack trace from previous location where exception was thrown ---
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed context)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync()
--- End of stack trace from previous location where exception was thrown ---
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextResourceFilter>g__Awaited|24_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResourceExecutedContextSealed context)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeFilterPipelineAsync()
--- End of stack trace from previous location where exception was thrown ---
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Logged|17_1(ResourceInvoker invoker)
   at Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)
   at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.Session.SessionMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.Session.SessionMiddleware.Invoke(HttpContext context)
   at DevExpress.AspNetCore.Internal.BinaryStorageMiddleware.Invoke(HttpContext httpContext)
   at DevExpress.AspNetCore.Internal.ResourceManagerMiddleware.Invoke(HttpContext httpContext)
   at Microsoft.AspNetCore.Localization.RequestLocalizationMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)
Exception thrown: 'System.NotImplementedException' in System.Private.CoreLib.dll
Exception thrown: 'System.NotImplementedException' in System.Private.CoreLib.dll
Microsoft.AspNetCore.Hosting.Diagnostics: Information: Request finished in 15984.5845ms 500 text/html; charset=utf-8

Solution

  • AsExpandable() should be placed after ToLinqToDB(). Lead should be placed in Select, databases do not allow window functions in Where statement.

    Also with linq2db you can omit LINQKit:

    var result = _fitDbContext.Testrunconfig
        .Include(x => x.Testruntestgrp)
        .Where(x => x.Testruntestgrp.Any(y => y.Testname == testName))
        .OrderByDescending(x => x.Id)
        .Select(x => new TestExecutionHelper()
        {
            TestrunConfig = x,
            SelectedTestName = testName,
            FinalResultSelectedTest = DetermineFinalResultForTestFunc.Compile()(x, testName)
        })
        .Select(x => new 
        {
            helper = x,
            next_value = Sql.Ext.Lead(x.FinalResultSelectedTest, Sql.Nulls.Respect)
                .Over()
                .OrderByDesc(x.TestrunConfig.Id)
                .ToValue()
        })
        .Where(x => x.next_vaue != x.FinalResultSelectedTest)
        .Select(x => x.helper)
        .ToLinqToDB()
        .ToList();