2009-05-04 63 views
9

我想从某个(Blobs)表中只选择几列。我有像Id,RowVersion,Size,Signature,Blob这样的字段,我只想选择前四个字段。我不喜欢这样写道:(--->是一个错误的地方),当我试图返回BlobDetails返回选定的指定列

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

错误occures - 作为VS.08不知道如何从匿名类型转换(allBlobs)列表。

我不想选择所有的值,因为Blob字段可能很重,我不想一直发送它。

你有什么想法如何正确地做到这一点?

回答

9

如果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组成,使其工作。

5

使用“select new {”创建一个不能隐式转换为BlobDetails的匿名类型。相反,显式声明的类型您在选择是newing:

var allBlobs = from b in dc.Blobs 
      orderby b.RowVersion descending 
      select new BlobDetails {Id = b.Id, .... }; 
allBlobs.ToList(); 
+0

谢谢。这样做,我必须实现IEnumerable接口到我的BlobDetails类。我想我可以做到这一点;-) – 2009-05-04 10:27:07