-
Notifications
You must be signed in to change notification settings - Fork 3.2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Query: Error calling Count() after GroupJoin() #7497
Labels
closed-fixed
The issue has been fixed and is/will be included in the release indicated by the issue milestone.
type-bug
Milestone
Comments
public class Blog
{
public int Id { get; set; }
public string Title { get; set; }
public List<Post> Posts { get; set; }
}
public class Post
{
public int Id { get; set; }
public int BlogId { get; set; }
public Blog Blog { get; set; }
}
using (var db = new MyContext())
{
// Run queries
var query = db.Set<Blog>().GroupJoin(db.Set<Post>(), blog => blog.Id, post => post.BlogId,
(blog, posts) => blog);
var count = query.Count();
} |
tuespetre
added a commit
to tuespetre/EntityFramework
that referenced
this issue
Feb 4, 2017
tuespetre
added a commit
to tuespetre/EntityFramework
that referenced
this issue
Feb 6, 2017
…ated SQL - Resolves dotnet#2341 - Resolves dotnet#5085 - Resolves dotnet#5230 - Resolves dotnet#6618 - Resolves dotnet#6647 - Resolves dotnet#6782 - Resolves dotnet#7080 - Resolves dotnet#7220 - Resolves dotnet#7417 - Resolves dotnet#7497 - Resolves dotnet#7523 - Resolves dotnet#7525
tuespetre
added a commit
to tuespetre/EntityFramework
that referenced
this issue
Feb 6, 2017
…ated SQL - Resolves dotnet#2341 - Resolves dotnet#5085 - Resolves dotnet#5230 - Resolves dotnet#6618 - Resolves dotnet#6647 - Resolves dotnet#6782 - Resolves dotnet#7080 - Resolves dotnet#7220 - Resolves dotnet#7417 - Resolves dotnet#7497 - Resolves dotnet#7523 - Resolves dotnet#7525
tuespetre
added a commit
to tuespetre/EntityFramework
that referenced
this issue
Feb 6, 2017
…ated SQL - Resolves dotnet#2341 - Resolves dotnet#5085 - Resolves dotnet#6618 - Resolves dotnet#6647 - Resolves dotnet#6782 - Resolves dotnet#7080 - Resolves dotnet#7220 - Resolves dotnet#7417 - Resolves dotnet#7497 - Resolves dotnet#7523 - Resolves dotnet#7525
tuespetre
added a commit
to tuespetre/EntityFramework
that referenced
this issue
Feb 6, 2017
…ated SQL - Resolves dotnet#2341 - Resolves dotnet#5085 - Resolves dotnet#6618 - Resolves dotnet#6647 - Resolves dotnet#6782 - Resolves dotnet#7080 - Resolves dotnet#7220 - Resolves dotnet#7417 - Resolves dotnet#7497 - Resolves dotnet#7523 - Resolves dotnet#7525
tuespetre
added a commit
to tuespetre/EntityFramework
that referenced
this issue
Feb 7, 2017
…ated SQL - Resolves dotnet#2341 - Resolves dotnet#5085 - Resolves dotnet#6618 - Resolves dotnet#6647 - Resolves dotnet#6782 - Resolves dotnet#7080 - Resolves dotnet#7220 - Resolves dotnet#7417 - Resolves dotnet#7497 - Resolves dotnet#7523 - Resolves dotnet#7525
tuespetre
added a commit
to tuespetre/EntityFramework
that referenced
this issue
Feb 9, 2017
…ated SQL - Resolves dotnet#2341 - Resolves dotnet#5085 - Resolves dotnet#6618 - Resolves dotnet#6647 - Resolves dotnet#6782 - Resolves dotnet#7080 - Resolves dotnet#7220 - Resolves dotnet#7417 - Resolves dotnet#7497 - Resolves dotnet#7523 - Resolves dotnet#7525
4 tasks
Transferring to @maumar ,
Which is incorrect since it would count number of rows instead of number of groups. We need to evaluate |
maumar
added a commit
that referenced
this issue
Mar 10, 2017
…ulting in unnecessary data pulling Problem was that for GroupJoin we would always force materialization on participating query sources. We were doing this because we are not always able to correctly divide outer elements of the GroupJoin into correct groups. However, if the GroupJoin clause is wrapped around SelectMany clause the groups don't matter because they are getting flattened by SelectMany anyway. Fix is to recognize those scenarios and only force materialization when the correct grouping actually matters. We can avoid materialization if the GroupJoin is followed by SelectMany clause (that references the grouping) and that the grouping itself is not present anywhere else in the query. This addresses optional navigations, which is the 80% case. Manually created GroupJoins that are not modeling LeftOuterJoins still require additional materialization, but this can be addressed later as the priority is not nearly as high. Other bugs fixed alongside the main change: #7722 - Query : error during compilation for queries with navigation properties and First/Single/client method operators inside a subquery. Problem here was that for some queries we don't know how to properly bind to a value buffer (when the result of binding is subquery, and not qsre). Fix/mitigation is to recognize those scenarios and force materialization on the subqueries. This can be properly addressed in later commit (i.e. by improving the binding logic) #7497 - Error calling Count() after GroupJoin() (and removed the temporary fix to #7348 and implemented a proper one) This turned out to be a chicken-and-egg problem - we had discrepancy between query sources that we marked for materialization in case of GroupJoin + result operator, and the actual client side operation that had to be performed. We had to fix the group join materialization to allow for translation of those result operators, but without fixing this issue also we would get invalid queries in some cases. Proper fix is to force client result operator only if the GroupJoin cannot be flattened. We also now do this for all result operators, not just a subset because it was possible to generate invalid queries with operaors like Count(). This is now consistent with the behavior of RequiresMaterializationExpressionVisitor. Also fixed several minor issues that were encountered once no longer do extensive materialization.
maumar
added a commit
that referenced
this issue
Mar 11, 2017
…ulting in unnecessary data pulling Problem was that for GroupJoin we would always force materialization on participating query sources. We were doing this because we are not always able to correctly divide outer elements of the GroupJoin into correct groups. However, if the GroupJoin clause is wrapped around SelectMany clause the groups don't matter because they are getting flattened by SelectMany anyway. Fix is to recognize those scenarios and only force materialization when the correct grouping actually matters. We can avoid materialization if the GroupJoin is followed by SelectMany clause (that references the grouping) and that the grouping itself is not present anywhere else in the query. This addresses optional navigations, which is the 80% case. Manually created GroupJoins that are not modeling LeftOuterJoins still require additional materialization, but this can be addressed later as the priority is not nearly as high. Other bugs fixed alongside the main change: #7722 - Query : error during compilation for queries with navigation properties and First/Single/client method operators inside a subquery. Problem here was that for some queries we don't know how to properly bind to a value buffer (when the result of binding is subquery, and not qsre). Fix/mitigation is to recognize those scenarios and force materialization on the subqueries. This can be properly addressed in later commit (i.e. by improving the binding logic) #7497 - Error calling Count() after GroupJoin() (and removed the temporary fix to #7348 and implemented a proper one) This turned out to be a chicken-and-egg problem - we had discrepancy between query sources that we marked for materialization in case of GroupJoin + result operator, and the actual client side operation that had to be performed. We had to fix the group join materialization to allow for translation of those result operators, but without fixing this issue also we would get invalid queries in some cases. Proper fix is to force client result operator only if the GroupJoin cannot be flattened. We also now do this for all result operators, not just a subset because it was possible to generate invalid queries with operaors like Count(). This is now consistent with the behavior of RequiresMaterializationExpressionVisitor. Also fixed several minor issues that were encountered once no longer do extensive materialization.
maumar
added a commit
that referenced
this issue
Mar 14, 2017
…ulting in unnecessary data pulling Problem was that for GroupJoin we would always force materialization on participating query sources. We were doing this because we are not always able to correctly divide outer elements of the GroupJoin into correct groups. However, if the GroupJoin clause is wrapped around SelectMany clause the groups don't matter because they are getting flattened by SelectMany anyway. Fix is to recognize those scenarios and only force materialization when the correct grouping actually matters. We can avoid materialization if the GroupJoin is followed by SelectMany clause (that references the grouping) and that the grouping itself is not present anywhere else in the query. This addresses optional navigations, which is the 80% case. Manually created GroupJoins that are not modeling LeftOuterJoins still require additional materialization, but this can be addressed later as the priority is not nearly as high. Other bugs fixed alongside the main change: #7722 - Query : error during compilation for queries with navigation properties and First/Single/client method operators inside a subquery. Problem here was that for some queries we don't know how to properly bind to a value buffer (when the result of binding is subquery, and not qsre). Fix/mitigation is to recognize those scenarios and force materialization on the subqueries. This can be properly addressed in later commit (i.e. by improving the binding logic) #7497 - Error calling Count() after GroupJoin() (and removed the temporary fix to #7348 and implemented a proper one) This turned out to be a chicken-and-egg problem - we had discrepancy between query sources that we marked for materialization in case of GroupJoin + result operator, and the actual client side operation that had to be performed. We had to fix the group join materialization to allow for translation of those result operators, but without fixing this issue also we would get invalid queries in some cases. Proper fix is to force client result operator only if the GroupJoin cannot be flattened. We also now do this for all result operators, not just a subset because it was possible to generate invalid queries with operaors like Count(). This is now consistent with the behavior of RequiresMaterializationExpressionVisitor. Also fixed several minor issues that were encountered once no longer do extensive materialization.
maumar
added a commit
that referenced
this issue
Mar 15, 2017
…ulting in unnecessary data pulling Problem was that for GroupJoin we would always force materialization on participating query sources. We were doing this because we are not always able to correctly divide outer elements of the GroupJoin into correct groups. However, if the GroupJoin clause is wrapped around SelectMany clause the groups don't matter because they are getting flattened by SelectMany anyway. Fix is to recognize those scenarios and only force materialization when the correct grouping actually matters. We can avoid materialization if the GroupJoin is followed by SelectMany clause (that references the grouping) and that the grouping itself is not present anywhere else in the query. This addresses optional navigations, which is the 80% case. Manually created GroupJoins that are not modeling LeftOuterJoins still require additional materialization, but this can be addressed later as the priority is not nearly as high. Other bugs fixed alongside the main change: #7722 - Query : error during compilation for queries with navigation properties and First/Single/client method operators inside a subquery. Problem here was that for some queries we don't know how to properly bind to a value buffer (when the result of binding is subquery, and not qsre). Fix/mitigation is to recognize those scenarios and force materialization on the subqueries. This can be properly addressed in later commit (i.e. by improving the binding logic) #7497 - Error calling Count() after GroupJoin() (and removed the temporary fix to #7348 and implemented a proper one) This turned out to be a chicken-and-egg problem - we had discrepancy between query sources that we marked for materialization in case of GroupJoin + result operator, and the actual client side operation that had to be performed. We had to fix the group join materialization to allow for translation of those result operators, but without fixing this issue also we would get invalid queries in some cases. Proper fix is to force client result operator only if the GroupJoin cannot be flattened. We also now do this for all result operators, not just a subset because it was possible to generate invalid queries with operaors like Count(). This is now consistent with the behavior of RequiresMaterializationExpressionVisitor. Also fixed several minor issues that were encountered once no longer do extensive materialization.
Fixed in 03a990c |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Labels
closed-fixed
The issue has been fixed and is/will be included in the release indicated by the issue milestone.
type-bug
I'm getting a runtime error after doing a Count() on a GroupJoin()
Steps to reproduce
Exception message:
Expression of type 'System.Collections.Generic.IEnumerable'1[System.Collections.Generic.IEnumerable'1[MyClass]]' cannot be used for return type 'System.Collections.Generic.IEnumerable`1[System.Int32]'
Stack trace:
at System.Linq.Expressions.Expression.ValidateLambdaArgs(Type delegateType, Expression& body, ReadOnlyCollection'1 parameters) at System.Linq.Expressions.Expression.Lambda[TDelegate](Expression body, String name, Boolean tailCall, IEnumerable'1 parameters) at System.Linq.Expressions.Expression.Lambda[TDelegate](Expression body, Boolean tailCall, IEnumerable'1 parameters) at System.Linq.Expressions.Expression.Lambda[TDelegate](Expression body, ParameterExpression[] parameters) at Microsoft.EntityFrameworkCore.Query.EntityQueryModelVisitor.CreateExecutorLambdaTResults at Microsoft.EntityFrameworkCore.Query.EntityQueryModelVisitor.CreateQueryExecutor[TResult](QueryModel queryModel) at Microsoft.EntityFrameworkCore.Storage.Database.CompileQuery[TResult](QueryModel queryModel) at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.<>c__DisplayClass19_0'1.b__0() at Microsoft.EntityFrameworkCore.Query.Internal.CompiledQueryCache.GetOrAddQuery[TResult](Object cacheKey, Func'1 compiler) at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.CompileQuery[TResult](Expression query) at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.Execute[TResult](Expression query) at Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryProvider.Execute[TResult](Expression expression) at System.Linq.Queryable.Count[TSource](IQueryable'1 source) at MyProject.Services.User.UserService.SearchUsers(ContactSearchCriteriaDto cscd) in C:\Users\john-luke.laue\repositories\MyProject\src\Services\User\UserService.cs:line 59
Further technical details
EF Core version: 1.0.0
Database Provider: Microsoft.EntityFrameworkCore.SqlServer
Operating system: Windows 10
IDE: Visual Studio 2015
The text was updated successfully, but these errors were encountered: