2016-05-20 3 views
0

Ich habe versucht, diese Frage/Problem im Abschnitt Probleme des EF Core GitHub zu stellen, aber habe keine Antwort erhalten, also muss ich davon ausgehen, dass ich gefragt habe falscher Ort ...EF 7/Core: Anzahl der Datensätze in der untergeordneten Tabelle ermitteln

ich mit den EntityFramework.Core und EntityFramework.MicrosoftSqlServer 7.0.0-rc1-Endverpackungen gerade arbeitete, und ich versuche, etwas über Code zu tun, wie die folgenden SQL aussieht:

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

ich habe versucht, die folgenden:

Option 1:

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

Option 2:

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

Die Beziehungen sind so konfiguriert, wie so die fliessend API:

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

Option 1 die folgende SQL erzeugt:

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) 

Wie Sie können sehen, es verbindet die RawClip-Tabelle für sich. Auf der einen Seite des Joins gibt es der Tabelle den Alias ​​"[up]", der ein Verweis auf UploadPackage zu sein scheint, obwohl die Tabelle, deren Aliasing es ist, tatsächlich die RawClip-Tabelle ist. Dies führt letztendlich zu einem Fehler, weil die WHERE-Klausel versucht, die Spalte "[up]. [UserId]" zu filtern, die in der UploadPackage-Tabelle, nicht aber in der RawClip-Tabelle vorhanden ist.

Option 2 schlägt fehl, ohne SQL zu generieren. Hier ist der Fehler mit Stack-Trace:

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) 

Mache ich etwas falsch? Gibt es einen besseren Weg, um das zu erreichen, was ich versuche? Es scheint wie eine ziemlich einfache Anwendungsfall, so stelle ich mir es hat einige Weg, um diese Arbeit zu machen ...

+0

Können Sie dies versuchen: DbContext.UploadPackages.Where (up => userIds.Contains (up.UserId)). SelectMany (u => u.Clips) .CountAsync(); Sie sollten nicht hinzufügen, wenn Sie eifrig sagen, welche Navigationseigenschaft Sie wollen –

+0

Ich würde nicht mehr Zeit mit RC1 verbringen. Viele Bugs wurden seit RC1 (November) behoben. RC2-final ist jetzt verfügbar. Siehe: https://blogs.msdn.microsoft.com/webdev/2016/05/16/announcing-asp-net-core-rc2/?utm_source=twitterfeed&utm_medium=facebook Ich habe bereits vor ein paar Monaten auf RC2 vor einigen Monaten aktualisiert, weil RC1 hatte zu viele Bugs mit selbst einfachen Join-Abfragen. – noox

+0

@noox Ja, du hast absolut recht. Guys auf EF GitHub sagten schließlich das Gleiche. RC2 behob das Problem. –

Antwort

1

ich schließlich eine Antwort auf meine Frage erhielt auf dem EF-Core GitHub veröffentlicht:

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

Dieses Problem war ein Fehler in RC1, der jetzt in RC2 behoben ist. Ich bin nach RC2 gewandert und alles sieht jetzt gut aus.

0

Try this:

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

Sie sollten nicht enthalten, wenn Sie eifrig sagen, was Navigationseigenschaft Sie wan

+0

Dies generierte das gleiche SQL wie Option 1 in meinem ursprünglichen Beitrag. –

Verwandte Themen