2009-02-26 4 views
5

Ho scritto un'app che uso come agente per interrogare i dati da un database e caricarlo automaticamente nella mia cache web distribuita .LINQ-to-SQL: ExecuteQuery (Type, String) popola un campo, ma non l'altro

Lo faccio specificando una query sql e un tipo in una configurazione. Il codice che in realtà l'interrogazione si presenta così:

List<Object> result = null; 
try { result = dc.ExecuteQuery(elementType, entry.Command).OfType<Object>().ToList(); } 
catch (Exception ex) { HandleException(ex, WebCacheAgentLogEvent.DatabaseExecutionError); continue; } 

elementType è uno System.Type creato dal tipo specificato nella configurazione (utilizzando Type.GetType()), e entry.Command è la query SQL.

Il tipo di entità speciali Io sto avendo un problema con un look come questo:

public class FooCount 
{ 
    [Column(Name = "foo_id")] 
    public Int32 FooId { get; set; } 

    [Column(Name = "count")] 
    public Int32 Count { get; set; } 
} 

La query SQL simile al seguente:

select foo_id as foo_id, sum(count) as [count] 
from foo_aggregates 
group by foo_id 
order by foo_id 

Per qualche ragione, quando viene eseguita la query, la proprietà "Count" finisce popolata, ma non la proprietà "FooId". Ho provato a eseguire personalmente la query e sono stati restituiti i nomi delle colonne corretti e i nomi delle colonne corrispondono a quelli specificati nei miei attributi di mapping. Aiuto!

+0

@BFree - modificare una domanda semplicemente per cambiare lo stile di codifica di qualcun altro è semplicemente scortese IMHO. Per favore non farlo. –

+0

Il mio male. Non pensavo che in realtà volessi farlo, pensavo fosse un incidente. – BFree

+0

@Daniel: il codice che spinge le persone a scorrere a destra per leggerlo è un ottimo modo per far sì che ignorino la tua domanda. Bitching alle persone che cercano di aiutare è un modo ancora migliore ..... –

risposta

5

Questo è folle ...

Che risolto il mio problema stava decorando la mia classe di entità con TableAttribute:

[Table(Name = "foo_aggregates")] 
public class FooCount 
{ 
    [Column(Name = "foo_id")] 
    public Int32 FooId { get; set; } 

    [Column(Name = "count")] 
    public Int32 Count { get; set; } 
} 

Avevo pensato (erroneamente, a quanto pare), che dal momento che non stava usando il GetTable<T>() metodo, non avevo bisogno del corrispondente attributo di mappatura.

Aggiornamento: Un anno e mezzo più tardi, finalmente aggiornato su di me sembra che le decorazioni ColumnAttribute sulle proprietà sono ignorati a meno che non ci sia una corrispondente decorazione TableAttribute sulla classe. Questo spiega perché la proprietà "Count" è stata popolata, poiché la sua denominazione corrisponderebbe alla colonna nell'istruzione SQL, mentre FooId/foo_id ovviamente non corrisponde.

+0

Ho assistito a questa correzione tramite SharedView, e ne sono sconcertato anche. – NilObject

+1

Non hai nemmeno bisogno del nome se lo stai facendo in questo modo. Puoi solo dire [Table]. – BFree

+0

Ho notato che funziona anche per query più complesse. Ho appena eseguito una query di ricorsione, quindi ho selezionato e funziona. –

2

Linq To Sql ha difficoltà nel mappare le cose quando i nomi delle proprietà sono diversi dai nomi delle colonne. Prova a cambiare il nome della tua proprietà su foo_id con il trattino basso. Quello dovrebbe al trucco.

In alternativa, oppure è possibile modificare l'istruzione select in foo_id come FooId in modo che corrisponda alla proprietà. In ogni caso, dovrebbero essere uguali (non è necessario essere lo stesso caso).

+0

Non ho mai avuto un problema con l'associazione fintanto che ho specificato il nome corretto della colonna nell'attributo di mappatura ... anche se questo avrebbe significato il senso del problema, ha (vedi la mia risposta) –

+0

Tipicamente quando trascini le tabelle/stored procedure su Linq su Sql desinger, fa tutto questo per te, quindi non presti attenzione agli attributi della tabella.Ti concentri maggiormente sulla roba della colonna. Impara qualcosa di nuovo ogni giorno ... – BFree

+0

Ho smesso di usare il designer quando ho iniziato a ricevere errori di compilazione casuali. Trovo altrettanto facile scrivere le proprietà come ho fatto sopra, ed è più facile da gestire nel progetto (IMHO), codice più pulito, ecc. –

Problemi correlati