efcore: EF Core 3.1 Urgent Issue:- ToQuery Method with Left Outer Join Causes an Error although it was working Properly with Previous Version
In EF Core 2.1, I was able to test SQL View with InMemory Provider using a custom ToQuery() method, like below:-
public DbSet<CustomerView> CustomerViews { get; set; }
if (Database.IsInMemory())
{
//In memory test query type mappings
modelBuilder.Entity<CustomerView>().HasNoKey().ToQuery(Build_Customers_Sql_View_InMemory());
}
private Expression<Func<IQueryable<CustomerView>>> Build_Customers_Sql_View_InMemory()
{
Expression<Func<IQueryable<CustomerView>>> query = () =>
from customer in Customers
join customerMembership in CustomerMemberships on customer.Id equals customerMembership.CustomerId into
nullableCustomerMemberships
from customerMembership in nullableCustomerMemberships.DefaultIfEmpty()
select new CustomerView
{
Id = customer.Id,
Name = customer.Name,
CustomerMembershipId = customerMembership != null? customerMembership.Id : default(int?),
CustomerMembershipName = customerMembership != null ? customerMembership.Name: ""
};
return query;
}
but after i upgrade to EF Core 3.1, I got an exception "System.InvalidOperationException : Processing of the LINQ expression" although my ToQuery method code works properly outside the method. Kindly, check the stack trace and working sample that produce the issue
System.InvalidOperationException : Processing of the LINQ expression 'DbSet<Customer>
.GroupJoin(
outer: DbSet<CustomerMembership>,
inner: customer => customer.Id,
outerKeySelector: customerMembership => customerMembership.CustomerId,
innerKeySelector: (customer, nullableCustomerMemberships) => new {
customer = customer,
nullableCustomerMemberships = nullableCustomerMemberships
})' by 'NavigationExpandingExpressionVisitor' failed. This may indicate either a bug or a limitation in EF Core. See https://go.microsoft.com/fwlink/?linkid=2101433 for more detailed information.
at Microsoft.EntityFrameworkCore.Query.Internal.NavigationExpandingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression)
at System.Linq.Expressions.MethodCallExpression.Accept(ExpressionVisitor visitor)
at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node)
at Microsoft.EntityFrameworkCore.Query.Internal.NavigationExpandingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression)
at System.Linq.Expressions.MethodCallExpression.Accept(ExpressionVisitor visitor)
at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node)
at Microsoft.EntityFrameworkCore.Query.Internal.NavigationExpandingExpressionVisitor.VisitConstant(ConstantExpression constantExpression)
at System.Linq.Expressions.ConstantExpression.Accept(ExpressionVisitor visitor)
at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node)
at Microsoft.EntityFrameworkCore.Query.Internal.NavigationExpandingExpressionVisitor.Expand(Expression query)
at Microsoft.EntityFrameworkCore.Query.QueryTranslationPreprocessor.Process(Expression query)
at Microsoft.EntityFrameworkCore.Query.QueryCompilationContext.CreateQueryExecutor[TResult](Expression query)
at Microsoft.EntityFrameworkCore.Storage.Database.CompileQuery[TResult](Expression query, Boolean async)
at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.CompileQueryCore[TResult](IDatabase database, Expression query, IModel model, Boolean async)
at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.<>c__DisplayClass9_0`1.<Execute>b__0()
at Microsoft.EntityFrameworkCore.Query.Internal.CompiledQueryCache.GetOrAddQueryCore[TFunc](Object cacheKey, Func`1 compiler)
at Microsoft.EntityFrameworkCore.Query.Internal.CompiledQueryCache.GetOrAddQuery[TResult](Object cacheKey, Func`1 compiler)
at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.Execute[TResult](Expression query)
at Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryProvider.Execute[TResult](Expression expression)
at Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1.GetEnumerator()
at Microsoft.EntityFrameworkCore.Internal.InternalDbSet`1.System.Collections.Generic.IEnumerable<TEntity>.GetEnumerator()
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
at EFInMemoryProviderSQLViewIssue.CustomerTests.Create_New_Customer()
Got Exceptions? Include both the message and the stack trace
-->
### Further technical details
EF Core version: 3.1.1
Database provider: (Microsoft.EntityFrameworkCore.InMemory)
Target framework: (.NET Core 3.1)
[EFInMemoryProviderSQLViewIssue.zip](https://github.com/dotnet/efcore/files/4112526/EFInMemoryProviderSQLViewIssue.zip)
IDE: (Visual Studio 2019 16.4.2)
About this issue
- Original URL
- State: closed
- Created 4 years ago
- Comments: 18 (11 by maintainers)
Commits related to this issue
- Query: Combine queryable method processing expression visitors Introduces QueryableMethodNormalizingExpressionVisitor which - Extract query metadata methods - Convert from enumerable to queryable - C... — committed to dotnet/efcore by smitpatel 4 years ago
- Query: Combine queryable method processing expression visitors Introduces QueryableMethodNormalizingExpressionVisitor which - Extract query metadata methods - Convert from enumerable to queryable - C... — committed to dotnet/efcore by smitpatel 4 years ago
- Query: Combine queryable method processing expression visitors Introduces QueryableMethodNormalizingExpressionVisitor which - Extract query metadata methods - Convert from enumerable to queryable - C... — committed to dotnet/efcore by smitpatel 4 years ago
@ahmedtolba1984 I can reproduce what you are seeing, but I’m not sure why it is failing.
@maumar @roji Could you guys take a look? We might need @smitpatel to take a look when he is back.
@ahmedtolba1984 If you need urgent help, there are paid support options
@ajcvickers @smitpatel @AndriySvyryd @roji @bricelam