9
votes

Utilisez délégué pour la projection à Linq à SQL

J'ai un code comme celui-ci dans une implémentation d'un irpostage à Linq à SQL à SQL:

                          firstProp = h.StringProp1,
                          secondProp = h.StringProp2


0 commentaires

4 Réponses :


0
votes

Jetez un coup d'œil à Automapper et outils similaires


1 commentaires

Oui, en réalité déjà en utilisant de l'approbement automapper, dans ce cas, ce n'était pas la meilleure approche



0
votes

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.


0 commentaires

7
votes

Vous pouvez résoudre ceci en utilisant la syntaxe de points plutôt que la syntaxe de style LINQ.

Votre actuel: p> xxx pré>

solution potentielle: p>

Func<MyType, MyBusinessBO> selector = h => new MyBusinessBO
{
    firstProp = h.StringProp1,
    secondProp = h.StringProp2
};
list
    .Where(h => h.StringProp1 == "1")
    .Select(selector);


2 commentaires

Bonne réponse. J'irais même une étape plus loin et définirais que func 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 ne peut pas être projeté dans SQL avec cadre d'entité. Je réalise que la question est de cibler linq-to-sql qui peut être capable de faire la projection, cependant d'écrire plus de code temporel, rend votre variable expression > pourrait être meilleur.



5
votes

requérablement.select code> nécessite une expression > code>. Vous pouvez écrire une méthode qui le renvoie et utilisez cette méthode partout où vous faites la transformation.

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();


2 commentaires

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 () . 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é) que vous essayez de convertir en une expression réutilisable, vous devez supprimer l'entité Paramètre et créez le Lambda comme indiqué ici - sinon chaque colonne de cette table sera récupérée.