2009-09-24 12 views
5

Spesso ho bisogno di combinare dati da più tabelle e visualizzare il risultato in un controllo GridView.Domanda da Linq a SQL Design

È possibile scrivere una query Linq in linea nell'evento Page_load, restituire un tipo anonimo che combina tutti i campi di cui ho bisogno e databind il risultato nel controllo GridView.

  • Problema: utilizzo i "metodi di supporto" come descritto da Scott Guthrie on his blog. Un tale metodo di supporto non può restituire un tipo anonimo. La query dovrebbe essere in linea per questo approccio.

Posso scrivere una vista del database che restituisce i dati di cui ho bisogno e scrivere un metodo di supporto con una query su questo (nuovo e conosciuto) tipo che restituisce.

  • Problema: nel mio schema di database avrò bisogno di molte viste e introdurrò molti aspetti ridondanti dei miei dati. Inoltre, ho perso alcuni dei vantaggi dell'utilizzo di Linq, rimuovendo tutte le logiche di business dal database.

Mi piacerebbe adottare un approccio che mi permetta di mantenere le query di Linq in metodi di supporto, ma mi consente di accedere a tutti gli attributi che ho bisogno sulla griglia nelle rispettive espressioni di databinding. Può essere fatto?

+0

È questo C#? Se lo è, otterrai più visualizzazioni aggiungendo un tag C#. Presumo ASP.NET, se si utilizza il controllo GridView. –

+0

Non penso che la lingua sia importante. – cdonner

risposta

1

Ho fatto la domanda sbagliata, come faccio spesso. Ciò che mi ha spinto a esaminare i tipi anonimi era un'apparente limitazione di GridView: la mia incapacità di utilizzare un'espressione di associazione in uno <asp:BoundField> (il parametro DataField accetta solo i nomi di colonna della tabella in cui viene richiamata la query di Linq).

Si scopre che in un TemplateField è è possibile utilizzare Eval e accedere ai membri dell'elemento di dati Linq e Linq si occupa della query per me. In altre parole, posso mantenere la query nel mio metodo helper, restituire un tipo di tabella di database primario (ad esempio Account) e associare gli account a GridView. Nelle espressioni di associazione dati posso accedere ai membri dati degli oggetti Account che risiedono in altre tabelle, senza doverli inserire esplicitamente nella query. Perfezionare.

0

Non so se esiste un modo valido per ottenere questo utilizzando i tipi anonimi. Ma ho un suggerimento che funzionerà in WinForms, ma non sono sicuro di ASP.NET.

Quello che ti serve è un tipo con proprietà in cui né il numero di proprietà, né i tipi e i nomi delle proprietà sono noti in fase di compilazione. Un modo per creare una cosa del genere è ICustomTypeDescriptor.

È necessario creare un tipo che implementa questa interfaccia con un archivio di riserva privato di oggetti che esegue il backup delle proprietà restituite dalla query per una riga dalla query. Quindi implementare GetProperties() per restituire uno PropertyDescriptor per colonna e PropertyDescriptor.GetValue() e PropertyDescriptor.SetValue() per accedere all'array di supporto.

Implementando PropertyDescriptor.Name si ottiene il nome corretto della colonna; questo richiederà probabilmente un altro backing store che memorizzi i nomi delle proprietà. E c'è ancora molto da implementare, ma alla fine il tuo nuovo tipo si comporterà quasi come un tipo normale - e ora il se - se il controllo che sei vincolante conosce e usa ICustomTypeDescriptor.

UPDATE

Ho appena trovato un po 'di testo che indica che l'associazione di dati ASP.NET conosce e utilizza ICustomTypeDescriptor.

+0

@Daniel Suggerimento interessante: si scopre che la soluzione è molto più semplice, vedere la mia risposta. – cdonner

0

precedente post di Scott nella serie parla di plasmare il set di risultati prima di inserire in una griglia:

Part 3 - Querying our Database

Scorrere fino a "Un progetto per i nostri risultati query".

+0

Ho letto anche questa parte, ed è esattamente da dove viene la mia confusione: in questa parte usa le query in linea per legare i tipi anonimi alla griglia, che funziona molto bene per le query in linea, ma l'approccio si interrompe quando segui il suo consiglio dalla parte 9 per estendere DataContext. – cdonner