2009-06-06 4 views
1

Учитывая такую ​​таблицу:LinqToSql - прочитать объект только с определенными свойствами

Foo 
    P1 
    P2 
    P3 

Как я могу читать Foo только с P1? Моя реализация:

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 
     }; 
    } 
} 

Есть ли альтернативы?

ответ

2

Обратите внимание, что для одного столбца вы можете избавиться от Anon типа полностью, и только select f.P1, но я оставлю это как он масштабируется до 2/3/и т.д. столбцов ...

Как около:

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

Главное - сломать композицию; AsEnumerable() делает это для нас.

Я также написал некоторый код для DbLinq, который допускает этот тип конструкции изначально - он может работать на LINQ-to-SQL; он находится на Usenet где-то ...

Вы также могли бы использовать что-то вроде PropertyCopy() (MiscUtil), чтобы избежать того, чтобы отобразить его самостоятельно:

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

Спасибо, Марк, для тебя намеки! Теперь позвольте мне усложнить ситуацию :-) http://stackoverflow.com/questions/959417/linqtosql-read-objects-hierarchy-with-only-certain-properties – alex2k8

0

еще одно решение:

db.ExecuteQuery<Foo>("SELECT Id, P1 FROM Foos WHERE Id = {0}", id).Single(); 
Смежные вопросы