linq2db / linq2db.EntityFrameworkCore

Bring power of Linq To DB to Entity Framework Core projects
MIT License
449 stars 39 forks source link

Support AsNoTrackingWithIdentityResolution #345

Closed warappa closed 9 months ago

warappa commented 10 months ago

Issue

I use Linq2DB.EntityFrameworkCore to do CTEs.

In one of them I switched from AsNoTracking() to AsNoTrackingWithIdentityResolution(). In my tests I now get an exception.

Exception

at LinqToDB.Linq.Builder.ExpressionBuilder.OptimizeExpressionImpl(HashSet`1 currentParameters, Expression expr) 
at LinqToDB.Expressions.TransformInfoVisitor`1.Transform(Expression expr) 
at LinqToDB.Linq.Builder.ExpressionBuilder.OptimizeExpression(Expression expression) 
at LinqToDB.Linq.Builder.ExpressionBuilder.ConvertWhere(MethodCallExpression method) 
at LinqToDB.Linq.Builder.ExpressionBuilder.OptimizeExpressionImpl(HashSet`1 currentParameters, Expression expr) 
at LinqToDB.Expressions.TransformInfoVisitor`1.Transform(Expression expr) 
at LinqToDB.Linq.Builder.ExpressionBuilder.OptimizeExpression(Expression expression) 
at LinqToDB.Linq.Builder.ExpressionBuilder.ConvertSelect(MethodCallExpression method) 
at LinqToDB.Linq.Builder.ExpressionBuilder.OptimizeExpressionImpl(HashSet`1 currentParameters, Expression expr) 
at LinqToDB.Expressions.TransformInfoVisitor`1.Transform(Expression expr) 
at LinqToDB.Expressions.TransformInfoVisitor`1.Transform[T](IList`1 source) 
at LinqToDB.Expressions.TransformInfoVisitor`1.Transform(Expression expr) 
at LinqToDB.Expressions.TransformInfoVisitor`1.Transform[T](IList`1 source) 
at LinqToDB.Expressions.TransformInfoVisitor`1.Transform(Expression expr) 
at LinqToDB.Expressions.TransformInfoVisitor`1.Transform[T](IList`1 source) 
at LinqToDB.Expressions.TransformInfoVisitor`1.Transform(Expression expr) 
at LinqToDB.Linq.Builder.ExpressionBuilder.OptimizeExpression(Expression expression) 
at LinqToDB.Linq.Builder.ExpressionBuilder.ConvertExpressionTree(Expression expression) 
at LinqToDB.Linq.Builder.ExpressionBuilder..ctor(Query query, ExpressionTreeOptimizationContext optimizationContext, ParametersContext parametersContext, IDataContext dataContext, Expression expression, ParameterExpression[] compiledParameters) 
at LinqToDB.Linq.Query`1.CreateQuery(ExpressionTreeOptimizationContext optimizationContext, ParametersContext parametersContext, IDataContext dataContext, Expression expr) 
at LinqToDB.Linq.Query`1.GetQuery(IDataContext dataContext, Expression& expr, Boolean& dependsOnParameters) 
at LinqToDB.Linq.ExpressionQuery`1.GetQuery(Expression& expression, Boolean cache, Boolean& dependsOnParameters) 
at LinqToDB.Linq.ExpressionQuery`1.System.Linq.IQueryProvider.Execute[TResult](Expression expression) 
...

Investigation

I think this is because only AsNoTracking is handled in this library: https://github.com/linq2db/linq2db.EntityFrameworkCore/blob/44de54e460309d3790a8eba8fc3375276201c93f/Source/LinqToDB.EntityFrameworkCore/LinqToDBForEFToolsImplDefault.cs#L556

https://github.com/linq2db/linq2db.EntityFrameworkCore/blob/44de54e460309d3790a8eba8fc3375276201c93f/Source/LinqToDB.EntityFrameworkCore/LinqToDBForEFToolsImplDefault.cs#L840-L844

Expectation

It should not throw an exception, but just note down that this query is not tracked and move on like in the AsNoTracking() case.

Info

.NET SDK: 7.0.401 Linq2DB.EntityFrameworkCore: 7.5.0 Linq2DB: 5.2.1/5.2.2

PS

Just a note for if you experience something similary: Weirdly, running my application and issuing the queries did not trigger this exception and thus completed successfully. I still don't know why, but I think it's releated to something else.