2009-05-04 12 views
9

Me gustaría seleccionar solo algunas columnas de una cierta tabla (Blobs). Tengo campos como: Id, RowVersion, Size, Signature, Blob, y quiero seleccionar solo los primeros cuatro. Lo hago así: (---> es un lugar de error)Devolver columnas especificadas seleccionadas

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

error occures cuando estoy tratando de volver BlobDetails - como VS.08 no sabe cómo convertir de Anónimo Tipo (allBlobs) Listar.

No quiero seleccionar todos los valores, porque el campo Blob puede ser bastante pesado y no quiero enviarlo todo el tiempo.

¿Tiene alguna idea de cómo hacerlo correctamente?

Respuesta

9

Si BlobDetailsno es la entidad LINQ, a continuación, puede hacerlo directamente:

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(); 

Sin embargo; Si BlobDetailses una entidad LINQ, es necesario utilizar 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(); 

Los AsEnumerable rompe la composición LINQ, hacer que funcione.

5

Con "seleccionar nuevo {" está creando un tipo anónimo que no se puede convertir implícitamente en BlobDetails. En su lugar, declarar explícitamente el tipo que está Newing dentro del selecto:

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

Gracias. Al hacer esto, tengo que implementar la interfaz IEnumerable en mi clase BlobDetails. Creo que puedo hacerlo ;-) –

+0

No, no tendrá que implementar IEnumerable. Extendí la muestra, pero supongo que ya lo descubrió en la muestra de @Marcs. –

+0

Sí, lo hice :-) Gracias. –

Cuestiones relacionadas