2009-02-26 5 views
5

ich eine App geschrieben habe, dass ich als Agenten verwenden, um Daten aus einer Datenbank abzufragen und diese automatisch in meinen verteilten Web-Cache geladen werden .LINQ-to-SQL: ExecuteQuery (Type, String) ein Feld auffüllt, aber nicht die andere

ich tun dies durch eine SQL-Abfrage und eine Art in einer Konfiguration angeben. Der Code, der die Abfrage tatsächlich tut, sieht wie folgt aus:

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

elementType ein System.Type aus dem in der Konfiguration angegebenen Typs erstellt ist (mit Type.GetType()) und entry.Command ist die SQL-Abfrage.

Die spezifische Entitätstyp ich mit Blicken ein Problem habe wie folgt aus:

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

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

Die SQL-Abfrage wie folgt aussieht:

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

Aus irgendeinem Grund, wenn die Abfrage ausgeführt wird, Die Eigenschaft "Count" wird zwar gefüllt, aber nicht die Eigenschaft "FooId". Ich habe versucht, die Abfrage selbst auszuführen, und die richtigen Spaltennamen werden zurückgegeben, und die Spaltennamen stimmen mit dem überein, was ich in meinen Zuordnungsattributen angegeben habe. Hilfe!

+0

@BFree - Bearbeiten einer Frage einfach zu ändern, jemand anderes Codierungsstil ist einfach nur unhöflich IMHO. Bitte nicht. –

+0

Mein schlechtes. Ich hätte nicht gedacht, dass du das wirklich willst, ich dachte es wäre ein Unfall. – BFree

+0

@Daniel - Beitragscode, der Leute dazu zwingt, nach rechts zu scrollen, um sie zu lesen, ist ein guter Weg, um sie dazu zu bringen, Ihre Frage zu ignorieren. Schimpfen bei Menschen, die versuchen wird, um eine noch bessere Möglichkeit ..... –

Antwort

5

Das ist verrückt ...

Was mein Problem behoben wurde meine Entitätsklasse mit TableAttribute Dekoration:

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

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

Ich hatte angenommen (zu Unrecht, anscheinend), da ich nicht die GetTable<T>() Verwendung wurde Methode, ich brauchte das entsprechende Mapping-Attribut nicht.

Update: Eineinhalb Jahre später, dämmerte es mir schließlich scheint es wie die ColumnAttribute Dekorationen auf den Eigenschaften ignoriert werden, es sei denn, es gibt eine entsprechende TableAttribute Dekoration auf der Klasse. Dies erklärt, warum die "Count" -Eigenschaft gefüllt wurde, da ihre Benennung der Spalte in der SQL-Anweisung entspricht, während FooId/foo_id natürlich nicht übereinstimmt.

+0

Ich wurde Zeuge dieses Fixes über SharedView, und ich bin davon verblüfft auch. – NilObject

+1

Sie brauchen den Namen nicht einmal, wenn Sie es so machen. Sie können einfach [Tabelle] sagen. – BFree

+0

Gerade bemerkt, es funktioniert auch für komplexere Abfrage Ich habe gerade eine Rekursion Abfrage und dann daraus ausgewählt und es funktioniert. –

2

Linq To Sql hat eine harte Mapping Sachen Zeit, wenn die Namen der Eigenschaften unterschiedlich sind als die Namen der Spalten. Versuchen Sie, den Eigenschaftsnamen in foo_id mit dem Unterstrich zu ändern. Das sollte zum Trick gehören.

Entweder das, oder Sie können Ihre Select-Anweisung foo_id als FooId ändern Ihr Eigentum entsprechen. In jedem Fall sollten sie gleich sein (muss aber nicht der gleiche Fall sein).

+0

Ich hatte noch nie ein Problem mit der Zuordnung, solange ich den richtigen Spaltennamen im Mapping-Attribut angegeben habe ... obwohl das ungefähr so ​​viel Sinn gemacht hätte, wie das Problem tatsächlich war, ha (siehe meine Antwort) –

+0

Nun, normalerweise, wenn Sie die Tabellen/Stored Procedures auf den Linq to Sql desinger ziehen, erledigt dies alles für Sie, Sie achten also nicht auf die Tabellenattribute.Sie konzentrieren sich mehr auf das Spaltenmaterial. Lerne jeden Tag etwas Neues ... – BFree

+0

Ich habe den Designer gestoppt, als ich anfing, zufällige Build-Fehler zu bekommen. Ich finde es genauso einfach, die Eigenschaften wie oben beschrieben aufzuschreiben, und es ist einfacher, im Projekt (IMHO), saubereren Code usw. zu verwalten. –