Je sais que je peux mapper deux types d'objets avec LINQ à l'aide d'une projection si:LINQ pour cartographier dynamiquement (ou construire des projections)
var destModel = from m in sourceModel
select new DestModelType {A = m.A, C = m.C, E = m.E}
où
class SourceModelType
{
string A {get; set;}
string B {get; set;}
string C {get; set;}
string D {get; set;}
string E {get; set;}
}
class DestModelType
{
string A {get; set;}
string C {get; set;}
string E {get; set;}
}
Mais si je veux faire quelque chose comme un générique pour le faire, où je ne connais pas précisément les deux types que je traite. Donc, il marcherait le type "Dest" et correspondrait avec les types "Source" correspondants .. est-ce possible? Aussi, pour réaliser l'exécution différée, je voudrais juste renvoyer un IQueryable.
Par exemple:
public IQueryable<TDest> ProjectionMap<TSource, TDest>(IQueryable<TSource> sourceModel)
{
// dynamically build the LINQ projection based on the properties in TDest
// return the IQueryable containing the constructed projection
}
Je sais que cela est difficile, mais je l'espère pas impossible, car il me sauvera un tas de travail de cartographie explicite entre les modèles et viewmodels.
Merci pour cette solution. Je suis profondément dans la compréhension de comment cela fonctionne. Si je voulais l'avoir dans des objets complexes, je devrais modifier le PropertyMap, correct? – CodeGrue
Si vous voulez comprendre comment l'expression est construite, je vous suggère d'utiliser LinqPad; cela vous permet d'inspecter facilement chaque noeud d'une expression. En ce qui concerne votre question, je ne suis pas sûr de comprendre ce que vous voulez dire ... si vous connaissez seulement les types source et destination, vous ne pouvez pas vraiment faire quelque chose de plus complexe que de copier des propriétés avec le même nom. –
Et si vous vouliez incorporer des objets complexes de sorte que item => new DestModelType() {A = élément.A.X, C = élément.C, E = élément.E}. Cela peut être dû à un attribut de propriété désignant les éléments à mapper. – CodeGrue