Возврат выбранных указанных столбцов - PullRequest
10 голосов
/ 04 мая 2009

Я хотел бы выбрать только несколько столбцов из определенной таблицы (BLOB-объектов). У меня есть поля, такие как: Id, RowVersion, Размер, Подпись, Blob, и я хочу выбрать только первые четыре. Я делаю это так: (---> это место ошибки)

public List<BlobDetails> GetAllBlobsNames()  
{  
    RichTekstModelDataContext dc = new RichTekstModelDataContext();

    var allBlobs = from b in dc.Blobs
               orderby b.RowVersion descending
               select new {b.Id, b.Size, b.Signature, b.RowVersion};

---> allBlobs.ToList<BlobDetails>();
}

public class BlobDetails   
{  
    public int Id { get; set; }  
    public string Signature { get; set; }  
    public int Size { get; set; }  
    public System.Data.Linq.Binary RowVersion { get; set; }     
}

Ошибка возникает при попытке вернуть BlobDetails - поскольку VS.08 не знает, как преобразовать анонимный тип (allBlobs) в список.

Я не хочу выбирать все значения, потому что поле Blob может быть довольно тяжелым, и я не хочу отправлять его все время.

У вас есть идеи, как это сделать правильно?

Ответы [ 2 ]

10 голосов
/ 04 мая 2009

Если BlobDetails не сущность LINQ, вы можете сделать это напрямую:

var qry = from b in dc.Blobs
          orderby b.RowVersion descending
          select new BlobDetails {
              Id = b.Id, Size = b.Size,
              Signature = b.Signature, RowVersion = b.RowVersion};

return qry.ToList();

Тем не менее, если BlobDetails является сущностью LINQ, вам необходимо использовать subtrefuge:

var qry = from b in dc.Blobs
          orderby b.RowVersion descending
          select new {b.Id, b.Size, b.Signature, b.RowVersion};

var typedQry = from b in qry.AsEnumerable()
               select new BlobDetails {
                  Id = b.Id, Size = b.Size,
                  Signature = b.Signature, RowVersion = b.RowVersion};
return typedQry.ToList();

AsEnumerable разбивает композицию LINQ, заставляя ее работать.

6 голосов
/ 04 мая 2009

С помощью «select new {» вы создаете анонимный тип, который не может быть неявно приведен к BlobDetails. Вместо этого явно объявите тип, который вы обновляете в select:

var allBlobs = from b in dc.Blobs
           orderby b.RowVersion descending
           select new BlobDetails {Id = b.Id, .... };
allBlobs.ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...