EF 7 / Core:子テーブルのレコード数の取得

c# entity-framework entity-framework-core sql-server

質問

私はEF Core GitHubの問題のセクションでこの質問/問題を提起するように頼みましたが、何の応答も得られなかったので、私は間違った場所で求めていたと仮定しなければなりません...

私は、EntityFramework.CoreとEntityFramework.MicrosoftSqlServer 7.0.0-rc1-finalパッケージを扱っています。次のようなコードを使って何かをしようとしています:

SELECT COUNT(*)
FROM [UploadPackage] [up]
INNER JOIN [RawClip] [rc] on [up].[Id] = [rc].[PackageId]
WHERE [up].[UserId] IN (1,2,3)

私は以下を試した:

オプション1:

DbContext.UploadPackages.Include(up => up.Clips).Where(up => userIds.Contains(up.UserId)).SelectMany(u => u.Clips).CountAsync()

オプション2:

DbContext.RawClips.Include(rc => rc.Package).Where(rc => userIds.Contains(rc.Package.UserId)).CountAsync()

リレーションシップは、Fluent APIを使用して次のように構成されます。

modelBuilder.Entity<UploadPackage>().HasMany(up => up.Clips).WithOne(rc => rc.Package);
modelBuilder.Entity<RawClip>().HasOne(rc => rc.Package).WithMany(up => up.Clips);

オプション1は、次のSQLを生成します。

SELECT [up].[Id], [up].[AssetId], [up].[FileName], [up].[FileSize], [up].[PackageId], [up].[Path], [up].[ProxyUrl], [up].[StatusDetails], [up].[StatusId], [up].[ThumbnailUrl], [up].[UploadCompletedDateTime], [up].[UploadStartedDateTime], [r].[Id], [r].[AssetId], [r].[FileName], [r].[FileSize], [r].[PackageId], [r].[Path], [r].[ProxyUrl], [r].[StatusDetails], [r].[StatusId], [r].[ThumbnailUrl], [r].[UploadCompletedDateTime], [r].[UploadStartedDateTime], [up].[Id]
FROM [RawClip] AS [up]
CROSS JOIN [RawClip] AS [r]
WHERE [up].[UserId] IN (2, 3, 4, 1)

ご覧のように、それはRawClipテーブルに自身を参加させています。結合の片側で、エイリアスが実際にRawClipテーブルであるにもかかわらず、UploadPackageへの参照と思われるエイリアス "[up]"をテーブルに与えています。これは最終的にwhere節がUploadPackageテーブルに存在するが、RawClipテーブルには存在しない "[up]。[UserId]"カラムをフィルタリングしようとしているためにエラーが発生します。

オプション2は、SQLを生成せずに失敗します。スタックトレースのエラーは次のとおりです。

InvalidOperationException: Sequence contains more than one element
System.Linq.Enumerable.Single[TSource](IEnumerable`1 source)
Microsoft.Data.Entity.Query.EntityQueryModelVisitor.<>c__DisplayClass79_0`1.<BindMemberExpression>b__0(IEnumerable`1 ps, IQuerySource qs)
Microsoft.Data.Entity.Query.EntityQueryModelVisitor.BindMemberExpressionCore[TResult](MemberExpression memberExpression, IQuerySource querySource, Func`3 memberBinder)
Microsoft.Data.Entity.Query.EntityQueryModelVisitor.BindMemberExpression[TResult](MemberExpression memberExpression, IQuerySource querySource, Func`3 memberBinder)
Microsoft.Data.Entity.Query.EntityQueryModelVisitor.BindMemberExpression(MemberExpression memberExpression, Action`2 memberBinder)
Microsoft.Data.Entity.Query.ExpressionVisitors.Internal.RequiresMaterializationExpressionVisitor.VisitMember(MemberExpression memberExpression)
System.Linq.Expressions.MemberExpression.Accept(ExpressionVisitor visitor)
System.Linq.Expressions.ExpressionVisitor.Visit(Expression node)
Microsoft.Data.Entity.Query.ExpressionVisitors.ExpressionVisitorBase.Visit(Expression expression)
Remotion.Linq.Clauses.ResultOperators.ContainsResultOperator.TransformExpressions(Func`2 transformation)
Remotion.Linq.QueryModel.TransformExpressions(Func`2 transformation)
Microsoft.Data.Entity.Query.ExpressionVisitors.Internal.RequiresMaterializationExpressionVisitor.VisitSubQuery(SubQueryExpression subQueryExpression)
Remotion.Linq.Clauses.Expressions.SubQueryExpression.Accept(ExpressionVisitor visitor)
System.Linq.Expressions.ExpressionVisitor.Visit(Expression node)
2000 
Microsoft.Data.Entity.Query.ExpressionVisitors.ExpressionVisitorBase.Visit(Expression expression)
Remotion.Linq.Clauses.WhereClause.TransformExpressions(Func`2 transformation)
Remotion.Linq.QueryModel.TransformExpressions(Func`2 transformation)
Microsoft.Data.Entity.Query.ExpressionVisitors.Internal.RequiresMaterializationExpressionVisitor.FindQuerySourcesRequiringMaterialization(QueryModel queryModel)
Microsoft.Data.Entity.Query.QueryCompilationContext.FindQuerySourcesRequiringMaterialization(EntityQueryModelVisitor queryModelVisitor, QueryModel queryModel)
Microsoft.Data.Entity.Query.EntityQueryModelVisitor.CreateAsyncQueryExecutor[TResult](QueryModel queryModel)
Microsoft.Data.Entity.Storage.Database.CompileAsyncQuery[TResult](QueryModel queryModel)
Microsoft.Data.Entity.Query.Internal.QueryCompiler.<>c__DisplayClass19_0`1.<CompileAsyncQuery>b__0()
Microsoft.Data.Entity.Query.Internal.CompiledQueryCache.GetOrAddAsyncQuery[TResult](Object cacheKey, Func`1 compiler)
Microsoft.Data.Entity.Query.Internal.QueryCompiler.CompileAsyncQuery[TResult](Expression query)
Microsoft.Data.Entity.Query.Internal.QueryCompiler.ExecuteAsync[TResult](Expression query, CancellationToken cancellationToken)
Microsoft.Data.Entity.Query.Internal.EntityQueryProvider.ExecuteAsync[TResult](Expression expression, CancellationToken cancellationToken)
Microsoft.Data.Entity.EntityFrameworkQueryableExtensions.ExecuteAsync[TSource,TResult](MethodInfo operatorMethodInfo, IQueryable`1 source, CancellationToken cancellationToken)
Microsoft.Data.Entity.EntityFrameworkQueryableExtensions.CountAsync[TSource](IQueryable`1 source, CancellationToken cancellationToken)

私は何か間違っているのですか?私がしようとしていることを達成するためのよりよい方法はありますか?それはかなり単純なユースケースのように思えるので、私はこの作業を行うためのいくつかの方法がなければならないと思います...

受け入れられた回答

私は最終的に、EF Core GitHubに掲載された問題についての返信を受けました:

https://github.com/aspnet/EntityFramework/issues/5413

この問題はRC1のバグで、RC2で修正されました。私はRC2に移行しました。


人気のある回答

これを試して:

DbContext.UploadPackages.Where(up => userIds.Contains(up.UserId)).SelectMany(u => u.Clips).CountAsync();

あなたは、あなたが夢中になったナビゲーションプロパティ



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ