J'ai un code comme celui-ci dans une implémentation d'un irpostage à Linq à SQL à SQL:
firstProp = h.StringProp1,
secondProp = h.StringProp2
4 Réponses :
Jetez un coup d'œil à Automapper et outils similaires P>
Oui, en réalité déjà en utilisant de l'approbement automapper, dans ce cas, ce n'était pas la meilleure approche
Utilisez peut-être des constructeurs non par défaut réguliers, plutôt que des initialisateurs d'objets. Ou, si vous pouvez commencer à utiliser C # 4.0, essayez d'ajouter des paramètres facultatifs / par défaut au mélange. P>
Vous pouvez résoudre ceci en utilisant la syntaxe de points plutôt que la syntaxe de style LINQ.
Votre actuel: p> solution potentielle: p> Func<MyType, MyBusinessBO> selector = h => new MyBusinessBO
{
firstProp = h.StringProp1,
secondProp = h.StringProp2
};
list
.Where(h => h.StringProp1 == "1")
.Select(selector);
Bonne réponse. J'irais même une étape plus loin et définirais que func code> comme méthode réelle. L'OP veut réutiliser cette logique de projection.
Une considération avant d'utiliser cette réponse est que func linq-to-sql code> qui peut être capable de faire la projection, cependant d'écrire plus de code temporel, rend votre variable expression
requérablement.select code> nécessite une expression public Expression<Func<DataObj, BusiObj>> GetExpr()
{
return h => new BusiObj()
{
firstProp = h.StringProp1,
secondProp = h.StringProp2
};
}
//get a local variable holding the expression.
Expression<Func<DataObj, BusiObj>> toBusiObj = GetExpr();
//use it thusly
var newList = (from h in list where h.StringProp1 == "1" select h)
.Select(toBusiObj)
.ToList();
//or
List<BusiObj> newList = list
.Where(h => h.StringProp1 == "1")
.Select(toBusiObj)
.ToList();
Une approche très similaire de Ckknight ci-dessus, mais cela ressemble à cela peut être mieux comme un moyen de créer un code plus clair. Il a la projection dans une fonction ré-utilisable séparée qui peut simplement être transmise. Ckknight a eu la réponse mais David B, vous l'avez travaillé de manière à ce que je veux être là où je veux être. J'ai évoqué la réponse Ckknight et j'ai accepté celui-ci.
Soyez averti: Il est extrêmement important d'utiliser la syntaxe exacte présentée ici pour la fonction getExpr () code>. Si vous avez une méthode de conversion DTE préexistante que vous avez utilisée dans plusieurs endroits tels que dte dte convert (entité entité) code> que vous essayez de convertir en une expression réutilisable, vous devez supprimer l'entité Code> Paramètre et créez le Lambda comme indiqué ici - sinon chaque colonne de cette table sera récupérée.