2009-02-25 13 views
11

Existe-t-il un moyen d'ajouter une propriété aux objets d'un résultat de requête Linq autre que les suivants?LINQ - Ajouter une propriété aux résultats

var query = from x in db.Courses 
       select new 
       { 
        x.OldProperty1, 
        x.OldProperty2, 
        x.OldProperty3, 
        NewProperty = true 
       }; 

Je veux faire cela sans énumérer toutes les propriétés actuelles de mon objet. Il y a beaucoup de propriétés, et je ne veux pas avoir à mettre à jour ce code chaque fois que je peux changer de classe.

J'apprends toujours avec LINQ et j'apprécie vos suggestions.

+0

Ceci est une question stupide. Je sais mieux maintenant. Les bibliothèques de mappage automatique ne sont que des bogues qui attendent de se produire. Ne sois pas paresseux. Ecrire le code de mappage –

Répondre

7

Ajouter avec des classes partielles:

public partial class Courses 
{ 
    public String NewProperty { get; set; } 
} 

Ensuite, vous pouvez l'affecter après avoir créé l'objet.

+0

C'est l'heure de la compilation. La question ne demande-t-elle pas le temps d'exécution, ce qui rend cette réponse non valide à la question? – peSHIr

+0

non c'est une bonne réponse. –

+4

Bien sûr, si vous voulez modifier la conception originale de la classe (pour en faire une partie), vous pouvez tout aussi bien aller de l'avant et ajouter la propriété ... –

6

Je suppose que vous pourriez retourner un nouvel objet composé de la nouvelle propriété et l'objet sélectionné, comme:

var query = from x in db.Courses 
       select new 
       { 
        Course x, 
        NewProperty = true 
       }; 
+2

Je cherchais vraiment plus un moyen d '"injecter" la propriété dans mon objet actuel. Mais merci! –

4

de eking réponse sera l'approche la plus simple. Si cela ne fonctionne pas pour vous (parce que vous devez transmettre les résultats, etc.) et si la classe que vous traitez définit déjà la propriété que vous voulez définir, vous pouvez créer un constructeur de copie ou méthode de fabrication qui prend une instance existante, plus la valeur de la propriété que vous souhaitez définir:

var query = from x in db.Courses 
      select new Course(x, valueOfNewProperty); 

Alternativement, si Coursene définit la propriété, vous pouvez sous-classe et utiliser la même approche:

var query = from x in db.Courses 
      select new CourseWithExtraProperty(x, valueOfNewProperty); 

(évidemment, choisissez un meilleur nom pour votre sous-classe)

Encore une fois, cependant, à moins que vous ayez vraiment besoin de faire cela, s'en tenir à la solution de eking.

1
  • ServiceStack a une built-in way pour gérer cela avec la méthode PopulateWith.

    • Voici un code example.

      foreach (var item in results) 
      { 
          var test1 = new ItemDto().PopulateWith(item); 
          test1.extraField1 = "extra"; 
          response.Add(test1); 
      }` 
      
  • Et si vous ne l'utilisez ServiceStack, vous pouvez toujours utiliser AutoMapper.

    CreateMap<Foo, Bar>().ForMember(x => x.ExtraBarProperty, opt => opt.Ignore());

Questions connexes