Initialisieren stark typisierter Objekte in LINQ auf Entities

entity-framework linq linq-to-entities strong-typing

Frage

Ich habe ein einfaches altes CLR-Objekt, das im Wesentlichen ein Wrapper für zwei Entity-Framework-Objekte ist. Ich mache dies, damit ich dieses Wrapper-Objekt an eine stark typisierte Ansicht im MVC-Framework übergeben kann. Meine Foo-Wrapper-Klasse ist sehr einfach:

public class FooWrapper
{
    public FooWrapper(Foo f, Bar b)
    {
        this.FooObject = f;
        this.BarObject = b;
    }

    public Foo FooObject { get; private set; }
    public Bar BarObject { get; private set; }
}

Was ich bisher für meine ListFoosWithBars-Funktion habe, ist wie folgt:

public IEnumerable<FooWrapper> ListFoosWithBars(int userID)
{
    IEnumerable<Bar> tempBar = ListBarsByUserID(userID);
    IEnumerable<FooWrapper> results = (from f in _entities.FooSet
                                       join b in tempBar on f.ID equals b.foos.ID
                                       select new FooWrapper(f, b));
    return results;
}

Dies funktioniert nicht, da LINQ to Entities offensichtlich keine parametrisierte Initialisierung unterstützt. Es wird eine Ausnahme ausgegeben, die nur Folgendes besagt: "In LINQ to Entities werden nur parameterlose Konstruktoren und Initialisierer unterstützt." Ich habe mich gefragt, ob es einen anderen Weg gibt, dieses Ergebnis zu erreichen?

Akzeptierte Antwort

WENN Sie Ihrem FooWrapper einen parameterlosen Konstruktor hinzufügen und stattdessen die Objektinitialisierung verwenden,

public IEnumerable<FooWrapper> ListFoosWithBars(int userID)
{
    IEnumerable<Bar> tempBar = ListBarsByUserID(userID);

    IEnumerable<FooWrapper> results = (
        from f in _entities.FooSet
        join b in tempBar on f.ID equals b.foos.ID
        select new FooWrapper()
        {
            FooObject = f, 
            BarObject = b
        });

    return results;
}

Beliebte Antwort

Ok, aber was ist, wenn Sie wollen, dass FooObject und BarObject nur gelesen werden können? Es scheint mir ein bisschen rückwärts, dass sie die Möglichkeit zur Verwendung eines Konstruktors für das Objekt negieren.

Ich kann viele Leute sehen, die die guten Einkapselungspraktiken brechen, um die Objektinitialisierung in diesem Szenario zu nutzen.



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum