J'ai un ancien objet CLR clair qui est essentiellement un wrapper pour deux objets de cadre d'entité, je le fais, donc je peux transmettre cet objet wrapper à une vue fortement tapée dans le cadre MVC. Ma classe Foo Wrapper est très simple:
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; }
5 Réponses :
Si vous ajoutez un constructeur sans paramètre à votre FOOWRAPPER, puis utilisez l'initialisation de l'objet à la place, comme:
Eu la même chose a tapé, vous gagnez.
Essayez une autre initialisation:
public class FooWrapper { public FooWrapper() { } public Foo FooObject { get; set; } public Bar BarObject { get; set; } } 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; }
OK, mais si vous voulez que FOOOBJECT et BarObject soit réadonnée? Cela me semble un peu reculé qu'ils négocient la capacité d'utiliser un constructeur sur l'objet. P>
Je peux voir beaucoup de gens enfreignant de bonnes pratiques d'encapsulation afin d'utiliser l'initialisation de l'objet dans ce scénario. P>
J'ai trouvé cette utile Quels moyens de contournement possibles sont-ils pour "Seuls les constructeurs sans paramètre sont la prise en charge de LINQ pour entendre" p>
Pourquoi n'utilisez-vous pas le .asenumerable ()? De cette façon, vous n'avez pas besoin de créer un constructeur sans paramètre et c'est ce que vous voulez.
Votre code était presque bon. Changez-le à ceci: P>
public IEnumerable<FooWrapper> ListFoosWithBars(int userID) { IEnumerable<Bar> tempBar = ListBarsByUserID(userID); IEnumerable<FooWrapper> results = (from f in _entities.FooSet.AsEnumerable() join b in tempBar on f.ID equals b.foos.ID select new FooWrapper(f, b)); return results; }
C'est de loin la meilleure solution à ce problème!
Je ferais simplement très attention à cette approche cependant, vous nuisez essentiellement aux avantages du cadre d'entité en appelant asen-tueuse. Une fois que vous avez précisé que vous apportez efficacement tous les enregistrements de la table de Fooset, puis effectuez la jointure locale dans la mémoire. Pensez simplement aux implications de la performance lorsque vous avez des milliers (ou des millions) d'enregistrements.
@Santo a accepté, cette approche provoque une hausse de ma machine avec une déclaration de Linq sur 16 tables, prend environ cinq minutes pour rendre un résultat. L'avait presque instantané avec une déclaration SQL comparable.