2016-08-14 2 views
1

Ich habe eine - vielleicht ein wenig peinlich - Frage, dass ich die Antwort nicht herausfinden kann. Ich habe folgende Einheiten:Wie nach mehreren verbundenen Entitäten in Entity Framework zu filtern

public class Post 
{ 
    public Guid Id { get; set; } 
    public string Text { get; set; } 
    public virtual ICollection<Tag> Tags { get; set; } 
} 

public class Tag 
{ 
    public Guid Id { get; set; } 
    public string Name { get; set; } 
} 

ich die Beziehung konfiguriert sein many-to-many die fließend API:

modelBuilder.Entity<Post>() 
    .HasMany(p => p.Tags) 
    .WithMany() 
    .Map(m => 
    { 
     m.MapLeftKey("PostId"); 
     m.MapRightKey("TagId"); 
     m.ToTable("PostTags"); 
    }); 

Ich möchte die Beiträge von einer Liste von Tags filtern (nur Rückkehr Beiträge, die alle Tags angegeben haben):

context.Posts.Where(p => p.Tags.Any(t => tags.Contains(t))) 

Wo tags ist eine Liste der vom Benutzer festgelegten Tags und meine Tag Einheit hat seine Equals Methode überschrieben basiert auf der Id Eigenschaft. Aber wenn ich die Abfrage ausführen bekomme ich ein NotSupportedException:

Eine Ausnahme vom Typ ‚System.NotSupportedException‘ aufgetreten in EntityFramework.SqlServer.dll wurde aber in Benutzercode

Zusätzliche Informationen nicht behandelt: Kann nicht erstellen ein konstanter Wert vom Typ 'Plog.Domain.Plog.Tag'. In diesem Kontext werden nur primitive Typen oder Aufzählungstypen unterstützt.

Wie kann ich diese Arbeit in einer Weise durchführen, die auch einigermaßen performant ist?

+0

Ich nehme an, Tags ist eine Liste von 'Tag'? Wenn ja, das ist das Problem – Balah

Antwort

1

Es sieht so aus, als ob Sie versuchen, Tags als eine Liste von Tag in Ihrer Abfrage zu verwenden. .Contains() funktioniert nicht mit Klassen, da sie keine Konstanten sind. Konvertieren Sie tags in eine Liste von Guid (da Sie auf Id überprüfen). d. h.

context.Posts.Where(p => p.Tags.Any(t => tags.Contains(t.Id))) 

Für die Leistung können Sie Indizes auf die Tabellen setzen. Das sind meine 2 Cent. Könnte heute bessere Wege sein, aber das obige hat in der Vergangenheit in Ordnung für mich geklappt.

+0

Danke, aber leider funktioniert es nicht, ich bekomme die gleiche Ausnahme (was verständlich ist, weil 'Guid' kein primitiver Typ ist). –

+0

Ok, das ist überraschend (ich habe es gerade erst neulich gemacht). Können Sie die Frage mit der Definition von "Tags" aktualisieren? – Balah

+0

Ich isolierte das Problem in einer separaten Lösung und Ihre Lösung funktionierte. Die Ausnahme war völlig unabhängig davon. Danke für Ihre Hilfe! –

Verwandte Themen