2009-05-04 16 views
9

Ich möchte nur wenige Spalten aus einer bestimmten Tabelle (Blobs) auswählen. Ich habe Felder wie: Id, RowVersion, Größe, Signatur, Blob, und ich möchte nur die ersten vier auswählen. Ich mache es wie folgt aus: (---> ist ein Fehler)Ausgewählte ausgewählte Spalten zurückgeben

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

Fehler occures wenn ich versuche, BlobDetails zurückzukehren - wie VS.08 weiß nicht, wie von Anonymous Typ (allBlobs) konvertieren auflisten.

Ich möchte nicht alle Werte auswählen, da das Blob-Feld ziemlich schwer sein kann und ich es nicht ständig senden möchte.

Haben Sie eine Idee, wie Sie es richtig machen?

Antwort

9

Wenn BlobDetailsnicht ist die LINQ Einheit, dann können Sie es direkt tun:

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

jedoch; wenn BlobDetails ist eine LINQ Einheit, müssen Sie subtrefuge verwenden:

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

Die AsEnumerable bricht die LINQ Zusammensetzung, sie arbeiten zu machen.

5

Mit "Select new {" erstellen Sie einen anonymen Typ, der nicht implizit in BlobDetails umgewandelt werden kann. Stattdessen ausdrücklich auf die Art zu erklären sind Sie newing im select:

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

Vielen Dank. Dazu muss ich die IEnumerable-Schnittstelle in meine BlobDetails-Klasse implementieren. Ich denke, ich kann es tun ;-) –

+0

Nein, Sie müssen IEnumerable nicht implementieren. Ich habe das Sample erweitert, aber ich denke, Sie haben es bereits aus dem @ Marcs-Sample herausgefunden. –

+0

Ja, ich tat :-) Danke. –