Initialisation d'objets fortement typés dans LINQ to Entities

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

Question

J'ai un ancien objet CLR simple qui est essentiellement un wrapper pour deux objets de cadre d'entité. Je le fais pour pouvoir le transmettre à une vue fortement typée du framework MVC. Ma classe wrapper foo est très simple:

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; }
}

Ce que j'ai jusqu'à présent pour ma fonction ListFoosWithBars est la suivante:

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;
}

Cela ne fonctionne pas car, à l’évidence, LINQ to Entities ne prend pas en charge l’initialisation paramétrée. Une exception est émise: "Seuls les constructeurs et les initialiseurs sans paramètres sont pris en charge dans LINQ to Entities." Je me demandais s'il y avait un autre moyen d'obtenir ce même résultat?

Réponse acceptée

SI vous ajoutez un constructeur sans paramètre à votre FooWrapper puis utilisez l'initialisation d'objet à la place, comme suit:

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;
}

Réponse populaire

Ok, mais si vous voulez que FooObject et BarObject soient en lecture seule? Il me semble un peu en arrière qu'ils nient la possibilité d'utiliser un constructeur sur l'objet.

Je peux voir beaucoup de gens enfreindre les bonnes pratiques d'encapsulation afin d'utiliser l'initialisation d'objet dans ce scénario.



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow