EntityFramework-Plus icon indicating copy to clipboard operation
EntityFramework-Plus copied to clipboard

IncludeOptimizedByPathIssue throw error

Open v-karnaukhov opened this issue 2 years ago • 1 comments

Description

IncludeOptimizedByPathIssue throw error

"Method Microsoft.EntityFrameworkCore.Query.RelationalShapedQueryCompilingExpressionVisitor+ShaperProcessingExpressionVisitor.PopulateCollection: type argument 'System.Collections.Generic.List1[System.Collections.Generic.List1[IssueWithAnyAll.Entities.File]]' violates the constraint of type parameter 'TRelatedEntity'."

Exact that code perfectly worked for EF 6, but now after upgrading to EF Core 7 it produce error.

In reproducing repo you can see this :

 var temp = context.Requests
        .Where(x => x.Id == 1)
        .IncludeOptimizedMultiple(votesIncludes)
        .FirstOrDefault();

where IncludeOptimizedMultiple is extension :

public static IQueryable<TEntity> IncludeOptimizedMultiple<TEntity>(
        this IQueryable<TEntity> query,
        IEnumerable<string> includes) where TEntity : class
    {
        if (includes != null)
        {
            query = includes.Aggregate(query, (current, include) => current.IncludeOptimizedByPath(include));
        }

        return query;
    }

Exception

Exception message:
Method Microsoft.EntityFrameworkCore.Query.RelationalShapedQueryCompilingExpressionVisitor+ShaperProcessingExpressionVisitor.PopulateCollection: type argument 'System.Collections.Generic.List`1[System.Collections.Generic.List`1[IssueWithAnyAll.Entities.File]]' violates the constraint of type parameter 'TRelatedEntity'.

Stack trace:
GenericArguments[2], 'System.Collections.Generic.List`1[System.Collections.Generic.List`1[IssueWithAnyAll.Entities.File]]', on 'Void PopulateCollection[TCollection,TElement,TRelatedEntity](Int32, Microsoft.EntityFrameworkCore.Query.QueryContext, System.Data.Common.DbDataReader, Microsoft.EntityFrameworkCore.Query.Internal.SingleQueryResultCoordinator, System.Func`3[Microsoft.EntityFrameworkCore.Query.QueryContext,System.Data.Common.DbDataReader,System.Object[]], System.Func`3[Microsoft.EntityFrameworkCore.Query.QueryContext,System.Data.Common.DbDataReader,System.Object[]], System.Func`3[Microsoft.EntityFrameworkCore.Query.QueryContext,System.Data.Common.DbDataReader,System.Object[]], System.Collections.Generic.IReadOnlyList`1[Microsoft.EntityFrameworkCore.ChangeTracking.ValueComparer], System.Collections.Generic.IReadOnlyList`1[Microsoft.EntityFrameworkCore.ChangeTracking.ValueComparer], System.Collections.Generic.IReadOnlyList`1[Microsoft.EntityFrameworkCore.ChangeTracking.ValueComparer], System.Func`5[Microsoft.EntityFrameworkCore.Query.QueryContext,System.Data.Common.DbDataReader,Microsoft.EntityFrameworkCore.Query.Internal.ResultContext,Microsoft.EntityFrameworkCore.Query.Internal.SingleQueryResultCoordinator,TRelatedEntity])' violates the constraint of type 'TRelatedEntity'.

Project

Reproducing repo is here : https://github.com/v-karnaukhov/z.entityframework.plus.issue. In repo you can find script for creating db structure (DB Scripts folder).

Further technical details

  • EF version: Microsoft.EntityFrameworkCore 7.0.5
  • EF Extensions version: 7.22.3
  • Database Provider: Microsoft.EntityFrameworkCore.SqlServer 7.0.5

v-karnaukhov avatar Jul 04 '23 14:07 v-karnaukhov

Hello @v-karnaukhov ,

Unfortunately, even if we learned a lot from this issue, we didn't succeed in fixing it.

You can still achieve this by performing a LINQ on your side:

var temp = context.Requests
	.Where(x => x.Id == 1)
	.IncludeOptimizedByPath($"{nameof(Request.Meetings)}.{nameof(MeetingRequest.Votes)}.{nameof(Vote.Documents)}")
	.IncludeOptimized(x => x.Meetings.SelectMany(x => x.Votes.SelectMany(x => x.Documents).Select(x => x.File)))
	.FirstOrDefault();

Only the second IncludeOptimized was not working to File not being a collection.

At this moment, we will not try deeper to fix it as we currently don't progress anymore on it. We simply don't know how to fix it.

Best Regards,

Jon

JonathanMagnan avatar Jul 14 '23 17:07 JonathanMagnan