2009-06-06 8 views
1

Compte tenu de ce tableau:LinqToSQL - lire l'objet avec seulement certaines propriétés

Foo 
    P1 
    P2 
    P3 

Comment puis-je lire Foo avec P1 seulement? Ma mise en œuvre:

public Foo GetFooWithP1(int id) 
{ 
    using (DbDataContext db = new DbDataContext()) 
    { 
     var query = 
      from f in db.Foos 
      where f.Id == id 
      select new 
      { 
       P1 = m.P1 
      }; 

     var data = query.SingleOrDefault(); 

     return new Foo 
     { 
      P1 = data.P1 
     }; 
    } 
} 

Y a-t-il des alternatives?

Répondre

2

Notez que pour une seule colonne, vous pouvez vous débarrasser de l'anon type complètement, et juste select f.P1, mais je vais laisser que comme des échelles 2/3/etc colonnes ...

Comment environ:

var query = 
     (from f in db.Foos 
     where f.Id == id 
     select new { f.P1 }).AsEnumerable() 
      .Select(row => new Foo { P1 = row.P1}); 

La principale chose est de rompre la composition; AsEnumerable() fait cela pour nous.

J'ai également écrit du code pour DbLinq qui permet nativement ce type de construction - cela peut fonctionner sur LINQ-to-SQL; il est sur usenet quelque part ...

Vous pouvez également utiliser quelque chose comme PropertyCopy() (MiscUtil) pour éviter d'avoir à la carte vous-même:

var tmp = (from f in db.Foos 
      where f.Id == id 
      select new { f.P1 }).Single(); 
return PropertyCopy<Foo>.CopyFrom(tmp); 
+0

Merci, Marc, pour toi des allusions! Maintenant laissez-moi compliquer les choses :-) http://stackoverflow.com/questions/959417/linqtosql-read-objects-hierarchy-with-only-certain-properties – alex2k8

0

Une solution plus:

db.ExecuteQuery<Foo>("SELECT Id, P1 FROM Foos WHERE Id = {0}", id).Single(); 
Questions connexes