2017-12-05 2 views
1

Angenommen, ein Kunde kann mehrere Adressen haben, aber nur eine "Preferred" -Adresse. Wie kann ich es so machen, dass eine Eigenschaft der Modellklasse nur die bevorzugte Adresse enthält und mit einem Lambda-Ausdruck über ein anderes Objekt arbeitet, zum Beispiel Order?Entity Framework-Beziehungen - Bevorzugte Kundenadresse

Klassen Mein Modell sieht wie folgt aus:

_context.Order.Where(x => x.Id == 20).Select(x => x.Person.PreferredAddress); 

Jedoch habe ich eine Fehlermeldung, erhalten:

public class Cusotmer 
{ 
    public virtual int Id {get; set;} 
    public virtual HashSet<Address> Addresses {get; set;} 
    public virtual Address PreferredAddress => Addresses.FirstOrDefault(x => x.Preferred) 
} 

public class Order 
{ 
    public virtual int Id {get; set;} 
    public virtual Customer Customer {get; set;} 
} 

ich diese arbeiten möchte

„Der angegebene Typ Mitglied 'PreferredAddress' wird in LINQ für Entitäten nicht unterstützt Nur Initialisierer, Entitätsmitglieder und Entitätsnavigation Eigenschaften werden unterstützt. "

+0

Leider Entity Framework fehlt Formel Eigenschaften wie NHibernate hat. Es wäre ein großartiges Feature. Wenn Sie diese Adresse regelmäßig benötigen, verwenden Sie eine Ansichtsmodell-/DTO-Klasse und AutoMapper. –

Antwort

0

Sie können nicht. Es ist nicht möglich. Da Sie Linq für Entities verwenden und diese Linq-Anweisungen in SQL Query umgewandelt werden, gibt es für die Eigenschaft PreferredAddress kein SQL-Äquivalent. Die Anweisung kann aus diesem Grund nicht in die SQL-Abfrage konvertiert werden.

Also, warum versuchst du es nicht einfach so?

_context.Order.Where(x => x.Id == 20).Select(x => x.Person.Addresses.FirstOrDefault(x => x.Preferred)); 
+0

FirstOrDefault() allein wird mir nicht die bevorzugte Adresse geben, vielleicht meintest du FirstOrDefault (x => x.Preferred). Trotzdem mag ich diese Lösung nicht, sie ist meiner Meinung nach etwas hässlich. Sie haben erwähnt, dass die Anweisung nicht in eine SQL-Abfrage konvertiert werden kann. Was passiert, wenn ich eine Ansicht erstelle, die nur die bevorzugte Adresse aller Kunden enthält und die Eigenschaft dieser Ansicht zuordnet? Wird es funktionieren? Wie sieht das in der Entitätskonfiguration aus? – ornstai

+0

Ja, ich meine das. Übrigens können Sie eine Ansicht erstellen, um äquivalente "PreferredAddress" für SQL durchzuführen. Sie sollten die Entität ändern oder eine neue Entität erstellen, um mit der neuen Ansicht zu arbeiten. Und es wird schwer zu verwalten sein. Aber ich denke, es wäre Übertechnik. – lucky