2009-02-07 7 views
0

Si j'ai quelque chose comme:initialisation LINQ et objet

var query = from children in _data.Children 
    where children.ChildId == childId 
    select new CustomModel.MyChild 
    { 
     ChildId = children.ChildId, 
     Name = children.ChildName 
    }; 

return query.FirstOrDefault(); 

Là où je veux l'objet résultant pour être mon modèle personnalisé. Puis-je gérer l'instanciation de modèle personnalisée dans une méthode différente, qui pourrait être réutilisée si j'avais plusieurs requêtes linq qui généraient toutes un modèle enfant personnalisé?

Par exemple,

var query = from children in _data.Children 
    where children.ChildId == childId 
    select CreateMyCustomChild([param ??]); 

return query.FirstOrDefault(); 

Cela pourrait bien être impossible, je ne sais pas, mais ce serait comme la signature de la méthode si elle est possible?

Je ne pense à réutiliser que lorsque plusieurs requêtes linq contiennent du code d'initialisation d'objet en double.

Merci

Répondre

1

Cela dépend vraiment de la version de LINQ que vous utilisez. Si vous utilisez LINQ to SQL, je ne crois pas que vous puissiez appeler des méthodes arbitraires dans la requête. Le traducteur de requête ne sais pas quoi faire avec la méthode appel

Si vous utilisez LINQ aux objets, vous avez tout à fait bien de le faire, comme ceci:

var query = from children in _data.Children 
    where children.ChildId == childId 
    select CreateMyCustomChild(children) 

return query.FirstOrDefault(); 

// Elsewhere 

public CustomModel.MyChild CreateMyCustomChild(OtherChild child) 
{ 
    return new CustomModel.MyChild 
    { 
     ChildId = child.ChildId, 
     Name = child.ChildName 
    }; 
} 

(Side note: J'appellerais la variable range dans la requête "child" plutôt que "children" car à un moment donné elle ne représente qu'un seul enfant.)

+0

@ Jon - merci. Malheureusement, c'est linqtosql. Obtenez également le point sur l'enfant singulier. –

0

Si vous vouliez vous pourriez écrire « sélectionner 1 » ou dans votre cas « CreateMyCustomChild (enfants) » puisque « les enfants » est contenant toutes vos informations. Dans votre cas, vous n'ajoutez pas beaucoup d'informations aux "enfants", alors pourquoi ne pas "sélectionner les enfants"?

En d'autres termes, essayez-le. Le type de retour de votre valeur déterminera sur quel type votre LINQ énumère.

0

Supposons que vous ayez une méthode qui a fait la transformation pour vous.

public static class Conversions 
{ 
    public static CustomModel.MyChild ToCustomModel(this DataModel.MyChild source) 
    { 
    return new CustomModel.MyChild() 
    { 
     ChildId = source.ChildId, 
     Name = source.ChildName 
    } 
    } 
} 

Vous pouvez utiliser une telle méthode pour effectuer la conversion d'un seul élément.

DataModel.MyChild myResult = getResult(); 
CustomModel.MyChild myConvertedResult = myResult.ToCustomModel() 

Un tel procédé peut également être utilisé dans un appel de méthode Enumerable.Select.

IEnumerable<DataModel.MyChild> myQueriedResults = getResult(); 
IEnumerable<CustomModel.MyChild> myConvertedResults = 
    myQueryiedResults.Select(c => c.ToCustomModel()); 
0

Alors que vous pouvez faire avec des expressions, je ne pense pas que cela en vaut la peine. Au lieu de cela, je vous suggère de définir une méthode d'extension comme:

IQueryable<CustomModel.MyChild> ToModel(this IQueryable<Child> childs) 
{ 
    return childs.Select(c=> 
     select new CustomModel.MyChild 
     { 
      ChildId = children.ChildId, 
      Name = children.ChildName 
     }  
    ); 
} 

Vous pouvez ensuite appeler:

return _data.Children 
    .Where(c=>c.ChildId == childId) 
    .ToModel() 
    .FirstOrDefault();