2009-05-12 9 views
17

C'è un modo per non recuperare una colonna specifica utilizzando linqtosql senza dover utilizzare un tipo anonimo e specificare ogni file restituito singolarmente?Linq to SQL - Non recuperare una particolare colonna

Utilizziamo SQLMetal per generare il file dbml che contiene tutti i tipi in cui inserire i risultati dei dati interrogati. Tuttavia, quando le colonne selezionate sono incluse nella query linq, i risultati vengono inseriti in un tipo anonimo anziché nel tipo dichiarato nel file dbml. Vorrei selezionare tutti tranne uno delle colonne da una tabella specifica, ma avere ancora i risultati restituiti nel tipo dbml correlato.

Qualsiasi idea apprezzata.

risposta

1

Grazie per l'input. La soluzione finale su cui mi sono basato è semplicemente specificare le colonne che voglio riportare MA per farlo all'interno dell'istruzione Linq in un nuovo oggetto del tipo che voglio ... un esempio dovrebbe aiutare!:

registro Tabella ha tre colonne

  • LOGID
  • DateLogged
  • SerializedData

Ma io voglio solo DateLogged & dati serializzati. Tuttavia, vorrei che questo all'interno un datacontainer generato da SQLMetal

ho raggiunto questo con la seguente affermazione:


Dim q = Da logItem In dc.Log Selezionare Nuovo Login Con {.LogID = logItem.LogID, .DateLogged = logItem.DateLogged}


Speranza che aiuta qualcun altro là fuori!

+1

Lei ha ragione, è possibile utilizzare una classe "nome" al posto di un classe anonima, ma ancora "specifichi ogni campo restituito individualmente", che hai detto nella tua domanda che non volevi fare: P – Lucas

0

Il modo in cui LINQ to SQL sa quali colonne includere è il tipo anonimo che si proietta sulla query. Non penso che ci sia un altro modo per avere LINQ to SQL escludere colonne in quanto una proiezione diretta restituirà tutto.

17

LINQ to SQL supporta lazy loading proprietà individuali. Nella finestra di progettazione DBML, è possibile impostare Delay Loaded su true nelle proprietà di una colonna. Le colonne caricate in ritardo non saranno incluse nell'iniziale SELECT. Se si tenta di accedere alla proprietà dell'oggetto e non è ancora stato caricato, verrà eseguita un'altra istruzione SELECT per portare questo valore dal DB.

Se si modifica manualmente il file DBML, impostare <Column IsDelayLoaded="true">. Se stai scrivendo manualmente le tue classi LINQ su SQL, è semplice come dichiarare il campo di supporto della proprietà come Link<T> anziché T. Per esempio:

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

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

veda anche la sezione "Delay/caricamento pigro" in this post by Scott Guthrie.


Aggiornamento: la risposta sopra riportata si applica se si desidera che la colonna sia ancora disponibile quando è necessaria. Non sarà incluso in SELECT s a meno che non lo richieda espressamente (vedere LoadOptions) o provare ad accedervi.

Se non si desidera utilizzare o accedere alla colonna e non si desidera che sia disponibile come proprietà di classe, andare con Serapth's answer di rimuovere la colonna dal file DBML. Assicurati di comprendere le implicazioni, come la perdita del controllo della concorrenza su quella colonna.

4

Se si è estremamente pigri, perché non aggiungere la tabella una seconda volta tramite il designer DBML, rinominarlo MyTableWithOutColumnX quindi eliminare il record che non si desidera restituire? Solo hilite il nome della colonna e premi cancella.

La sua sciatta, ma poi, in una certa misura, lo è anche avere una tabella in cui un record non dovrebbe apparire a volte. Più di ogni altra cosa, è facile, è tutto astratto nel DBML, quindi non dovrebbe influenzare il tuo codice, oltre a cambiare a quale tabella accedere. Ben detto, potrebbe anche avere senso che qualcuno mantenga il tuo codice in un lontano futuro.

1

Vedere this link per un esempio di come abilitare il caricamento lazy delle colonne utilizzando SQLMetal.

Esso utilizza fondamentalmente XSLT al post-processo il file generato per convertire il tipo di colonna X-Link<X> (entrambi i tipi dal System.Data.Linq namesapce)