2016-06-24 9 views
0

ich die folgenden Klassen:EF7/Linq - "Enthält" Abfrage mit verschachtelten Objekt throws Exception

public class ActivityEntry 
{  
    public int Id { get; set; } 

    public int CostCenterId { get; set; } 
    [ForeignKey("CostCenterId")] 
    public CostCenter CostCenter { get; set; } 
} 

public class CostCenter 
{ 
    public int Id {get;set;} 
    public int ActivityId { get; set; } 
} 

ich alle ActivityEntries abfragen möchten, wo die CostCenter bestimmte ActivityIds hat.

Für den Filter habe ich eine Liste mit activityIds (filterList). Die folgende Abfrage führt eine System.InvalidOperationException

ErrorMessage

"Die Sequenz mehr als ein Element enthält"

Und ich verstehe nicht, warum.

var filterList = new List<int> {1}; 

var data = _db.ActivityEntry 
       .Include(x => x.CostCenter) 
       .Where(x => filterList.Contains(x.CostCenter.ActivityId)) 
       .ToList(); 

Eine weitere WHERE Erklärung, die nicht das verschachtelte Objekt nicht verwendet CostCenter fein arbeitet.

.Where(x =>filterList.Contains(x.CostCenterId)) 

Muss ich eine andere Syntax verwenden für die Aktivität-Ids in CostCenter Objekt abzufragen?

Stapelüberwachung:

bei System.Linq.Enumerable.Single [TSource] (IEnumerable 1 source) bei Microsoft.Data.Entity.Query.EntityQueryModelVisitor.<>c__DisplayClass79_0 1.b__0 (IEnumerable 1 ps, IQuerySource qs) bei Microsoft.Data.Entity.Query.EntityQueryModelVisitor.BindMemberExpressionCore[TResult](MemberExpression memberExpression, IQuerySource querySource, Func 3 memberBinder) bei Microsoft.Data.Entity.Query.EntityQueryModelVisitor.BindMemberExpression [ TResult] (Membermember, IQuerySource querySource, Func 3 memberBinder) bei Microsoft.Data.Entity.Query.EntityQueryModelVisitor.BindMemberExpression(MemberExpression memberExpression, Action 2 memberBinder) bei Microsoft.Data.Entity.Query.ExpressionVisitors.Internal.RequiresMaterializationExpressionVisitor.VisitMember (Membermember) bei System.Linq.Expressions.MemberExpression.Accept (Expression Besucher) bei Microsoft.Data.Entity.Query.ExpressionVisitors.ExpressionVisitorBase.Visit (Expression expression) bei Remotion.Linq.Clauses.ResultOperators.ContainsResultOperator.TransformExpressions (Func 2 transformation) bei Remotion.Linq.QueryModel.TransformExpressions(Func 2 Transformation) bei Microsoft.Data.Entity.Query.ExpressionVisitors. Internal.RequiresMaterializationExpressionVisitor.VisitSubQuery (SubQueryExpression subQueryExpression) bei Remotion.Linq.Clauses.Expressions.SubQueryExpression.Accept (Expression Besucher) bei Microsoft.Data.Entity.Query.ExpressionVisitors.ExpressionVisitorBase.Visit (Expression Ausdruck) bei Remotion.Linq .Clauses.WhereClause.TransformExpressions (Func 2 transformation) bei Remotion.Linq.QueryModel.TransformExpressions(Func 2 Umwandlung) bei Microsoft.Data.Entity.Query.ExpressionVisitors.Internal.RequiresMaterializatio nExpressionVisitor.FindQuerySourcesRequiringMaterialization (QueryModel queryModel) bei Microsoft.Data.Entity.Query.QueryCompilationContext.FindQuerySourcesRequiringMaterialization (EntityQueryModelVisitor queryModelVisitor, QueryModel queryModel) bei Microsoft.Data.Entity.Query.EntityQueryModelVisitor.CreateQueryExecutor [TResult] (QueryModel queryModel) bei Microsoft .Data.Entity.Storage.Database.CompileQuery [TResult] (QueryModel queryModel) --- Ende der Stapelüberwachung vom vorherigen Ort --- bei Microsoft.Data.Entity.Query.Internal.QueryCompiler . <> c__DisplayClass18_0 1.<CompileQuery>b__0() bei Microsoft.Data.Entity.Query.Internal.CompiledQueryCache.GetOrAddQuery[TResult](Object cacheKey, Func 1 Compiler) bei Microsoft.Data.Entity.Query.Internal.QueryCompiler.CompileQuery [TResult] (Ausdruck Query) bei Microsoft.Data.Entity.Query.Internal.QueryCompiler.Execute [TResult] (Ausdruck Abfrage) bei Microsoft.Data.Entity.Query.Internal.EntityQueryProvider.Execute [TResult] (Ausdruck expression) bei Remotion.Linq.QueryableBase 1.GetEnumerator() bei System.Collections.Generic.List 1..ctor (IEnumerable 1 collection) bei System.Linq.Enumerable.ToList[TSource](IEnumerable 1 Quelle) bei zetvnext.application.Services.ReportService.GetCostCenterReportData (FilterDto Filter) in C: \ Source \ zetvnext \ src \ zetvnext.application \ Services \ ReportService.cs: Zeile 86. bei zetvnext.tests.ReportServiceTests.Test_Report_Data() in C: \ Source \ zetvnext \ Tests \ zetvnext.tests \ ReportServiceTests.cs: Zeile 142.

+0

ActivityEntry scheint nicht ein Employee Eigenschaft zu enthalten. Ich bezweifle, dass das das Problem ist, aber ich frage mich, was du sonst noch nicht zeigst ... :-) –

+0

Du bekommst im Allgemeinen keinen Fehler, wenn * die obige Abfrage konstruiert wird - wenn ein Fehler generiert werden soll, dann normalerweise passiert, wenn Sie * es ausführen, zB indem Sie 'ToList()' aufrufen. Die angegebene Ausnahme ist eine, die Sie wahrscheinlich von 'Single()' erhalten. Können Sie uns zeigen, wie die Ergebnisse materialisiert werden (d. H. Wie werden die Ergebnisse der Abfrage verwendet)? –

+0

@Gary McGill Hinzugefügt den Mitarbeiter (ich versuche, nur die Teile zu integrieren, die notwendig sind, um die Frage zu verstehen, wenn ich hier auf SO poste ;-)) + ToList() hinzugefügt - verpasst, dass - die Ausnahme beim Ausführen ausgelöst wird. – Jetro223

Antwort

Verwandte Themen