2009-05-04 6 views
9

Je voudrais sélectionner seulement quelques colonnes d'une certaine table (Blobs). J'ai des champs comme: Id, RowVersion, Taille, Signature, Blob, et je veux sélectionner seulement les quatre premiers. Je le fais comme ceci: (---> est un lieu d'erreur)Retourne les colonnes sélectionnées sélectionnées

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

Erreur occures quand je suis en train de revenir BlobDetails - comme VS.08 ne sait pas comment convertir type anonyme (allBlobs) lister.

Je ne veux pas sélectionner toutes les valeurs, car le champ Blob peut être assez lourd et je ne veux pas l'envoyer tout le temps.

Avez-vous une idée de comment le faire correctement? Avec "select new {", vous créez un type anonyme qui ne peut pas être implicitement converti en BlobDetails.

Répondre

9

Si BlobDetailsn'est pas l'entité LINQ, vous pouvez le faire directement:

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

Cependant; si BlobDetailsest une entité LINQ, vous devez utiliser 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(); 

Les AsEnumerable brise la composition LINQ, le faire fonctionner.

5

Au lieu de cela, déclarer le type que vous êtes explicitement newing dans le select:

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

Merci. Pour ce faire, je dois implémenter l'interface IEnumerable dans ma classe BlobDetails. Je pense que je peux le faire ;-) –

+0

Non, vous ne devrez pas implémenter IEnumerable. J'ai étendu l'échantillon, mais je suppose que vous l'avez déjà compris dans l'exemple @Marcs. –

+0

Oui, je l'ai fait :-) Merci. –

Questions connexes