2009-05-12 12 views
17

Gibt es eine Möglichkeit, nicht eine bestimmte Spalte mit linqtosql abrufen, ohne einen anonymen Typ verwenden und jedes zurückgegebene Feld einzeln angeben?Linq to SQL - Eine bestimmte Spalte nicht abrufen

Wir verwenden SQLMetal, um die dbml-Datei zu generieren, die alle Typen enthält, in die die abgefragten Datenergebnisse eingefügt werden. Wenn jedoch ausgewählte Spalten in der linq-Abfrage enthalten sind, werden die Ergebnisse in einen anonymen Typ anstelle des in der dbml-Datei deklarierten Typs übernommen. Ich möchte alle außer einem der Spalten aus einer bestimmten Tabelle auswählen, aber die Ergebnisse immer noch in den zugehörigen dbml-Typ zurückgegeben.

Irgendwelche Ideen geschätzt.

Antwort

1

Vielen Dank für Ihre Eingabe. Die endgültige Lösung, die ich beschlossen habe, besteht darin, einfach die Spalten anzugeben, die ich zurückbringen möchte, ABER dies innerhalb der Linq-Anweisung in einem neuen Objekt des Typs zu tun, den ich möchte ... ein Beispiel sollte helfen!:

Tabelle log hat drei colums

  • LogID
  • DateLogged
  • SerializedData

Aber ich will DateLogged nur & serialisierten Daten. Allerdings würde ich diese innerhalb ein Datacontainer von SQLMetal erzeugt wie

ich erreicht dies mit der folgenden Aussage:


Dim q = Von logItem In dc.Log Select New Log Mit {.LogID = logItem.LogID, .DateLogged = logItem.DateLogged}


Hoffnung, dass da draußen jemand anderes hilft!

+1

Sie zu konvertieren richtig sind, können Sie einen „Namen“ Klasse verwenden, statt ein anonyme Klasse, aber Sie geben immer noch "jedes zurückgegebene Feld einzeln an", das Sie in Ihrer Frage angegeben haben, was Sie nicht tun wollten: P – Lucas

0

Wie LINQ to SQL weiß, welche Spalten eingeschlossen werden sollen, hängt vom anonymen Typ ab, den Sie über die Abfrage projizieren. Ich glaube nicht, dass es eine andere Möglichkeit gibt, LINQ to SQL Spalten auszuschließen, da eine gerade Projektion alles zurückgibt.

17

LINQ to SQL unterstützt lazy loading einzelne Eigenschaften. Im DBML-Designer können Sie in den Eigenschaften einer Spalte Delay Loaded auf true setzen. Spalten, die verzögert geladen werden, sind nicht in der ursprünglichen SELECT enthalten. Wenn Sie versuchen, auf die Eigenschaft des Objekts zuzugreifen, und es wurde noch nicht geladen, wird eine weitere SELECT-Anweisung ausgeführt, um diesen Wert aus dem DB zu holen. Wenn Sie die DBML-Datei von Hand bearbeiten, legen Sie <Column IsDelayLoaded="true"> fest. Wenn Sie Ihre LINQ to SQL-Klassen von Hand schreiben, ist es einfach, das Hintergrundfeld der Eigenschaft als Link<T> anstelle von T zu deklarieren. Zum Beispiel:

[Table] 
public class Person 
{ 
    private Link<string> _name; 

    [Column(Storage = "_name")] 
    public string Name 
    { 
     get { return _name.Value; } 
     set { _name.Value = value; } 
    } 
} 

Siehe auch "Delay/Lazy Loading-" in this post by Scott Guthrie.


Update: Die obige Antwort gilt, wenn die Spalte weiterhin verfügbar sein soll, wenn Sie sie benötigen. Es wird nicht in SELECT s enthalten sein, es sei denn, Sie fragen ausdrücklich danach (siehe LoadOptions) oder versuchen Sie, darauf zuzugreifen.

Wenn Sie die Spalte überhaupt nicht verwenden oder darauf zugreifen möchten und sie nicht als Klasseneigenschaft verfügbar sein soll, dann gehen Sie mit Serapth's answer zum Entfernen der Spalte aus der DBML-Datei. Stellen Sie sicher, dass Sie die Auswirkungen verstehen, z. B. den Verlust der Gleichzeitigkeitsprüfung für diese Spalte.

4

Wenn Sie extrem faul sind, warum nicht die Tabelle ein zweites Mal über DBML-Designer hinzufügen, benennen Sie es MyTableWithOutColumnX dann löschen Sie den Datensatz, den Sie nicht zurückgeben möchten? Einfach den Spaltennamen markieren und auf Löschen klicken.

Es ist schlampig, aber dann, bis zu einem gewissen Grad, so hat eine Tabelle, wo eine Aufzeichnung manchmal nicht erscheinen sollte. Mehr als alles andere ist es einfach, alles wird in der DBML abstrahiert, so dass es keinen Einfluss auf Ihren Code haben sollte, außer dass Sie auf die Tabelle zugreifen müssen. Gut benannt, könnte es sogar sinnvoll sein, wenn jemand in der fernen Zukunft seinen Code beibehält.

1

Betrachten Sie this link für ein Beispiel zum Aktivieren des verzögerten Ladens von Spalten mit SQLMetal.

Es nutzt grundsätzlich XSLT nachbearbeiten die generierte Datei den Spaltentyp X-Link<X> (beide Typen von der System.Data.Linq namesapce)