2009-04-01 4 views
9

Wie kann ich einem LINQ-Datenkontext mitteilen, bestimmte Eigenschaften oder alle schreibgeschützten Eigenschaften zu ignorieren, wenn eine Ergebnismenge an ein Objekt gebunden wird?Ignorieren Sie schreibgeschützte Klasseneigenschaften, wenn Sie DataContext.ExecuteQuery verwenden <T>

Ich arbeite mit einigen T-SQL-Anweisungen, die mit LINQ schwierig zu äußern sind, daher verwende ich die ExecuteQuery-Methode des Datenkontext, um das direkte T-SQL an die Datenbank zu übergeben.

Wenn meine Klasse T über schreibgeschützte Eigenschaften verfügt, erhalte ich zur Laufzeit Ausnahmen, wenn der Datenkontext versucht, diese Eigenschaften festzulegen, und schlägt fehl, da keine Setter-Eigenschaft vorhanden ist. Wie erkläre ich dem Kontext, diese Eigenschaften zu ignorieren?

Das mache ich jetzt. Es funktioniert, aber es saugt:

public bool IsPaidInFull { 
    get { return NetTotal <= 0m; } 
    set { /* needed so linq doesn't choke. Should never be set by hand */ } 
} 
+0

Darf ich der Erste sein, der vorschlägt - "do_do_ that"? –

+1

Tue nicht was genau? Die Problemumgehung ist eine Sünde und ist inakzeptabel, daher mein Beitrag hier. Wenn Sie meinen, "finden Sie keine Möglichkeit, bestimmte Eigenschaften zu überspringen, wenn Sie an die Ergebnismenge binden", können Sie das bitte erklären? –

Antwort

0

Haben Sie Linq an Entitäten in Betracht gezogen? Es ist vielleicht nicht die Mühe wert, Ihr Projekt zu konvertieren, abhängig davon, wie weit Sie sich entfernt haben oder wie viel Aufwand Sie mit der Organisation haben. Dieses genaue Szenario wäre jedoch in Linq to Entities kein Problem. Es versucht nicht, schreibgeschützte Eigenschaften im Objekt zu aktualisieren, wenn es geladen wird, da sie nicht explizit zugeordnet sind. Sie sind lediglich Erweiterungseigenschaften.

Sie könnten auch die Oldschool/Java-Route verwenden, indem Sie Getterfunktionen anstelle von Eigenschaften verwenden. public bool getIsPaidInFull() {return NetTotal < = 0m;}.

Oder Sie könnten mit der Implementierung der schreibgeschützten Eigenschaften in einer geerbten untergeordneten Klasse herumspielen, aber das kann alle Arten von Typproblemen einführen.

+0

Das ist leider keine mögliche Lösung für dieses Projekt, aber danke für den Tipp. Ich denke, wir könnten in Zukunft ein vollständiges ORM in Betracht ziehen; L2S eignet sich hervorragend als einfacher Wrapper für das Datenmodell. Es kann jedoch schwierig sein, es als Mapping-Layer für Entitäten zu verwenden. Ich akzeptiere Ihren "Old School" Vorschlag als Antwort. Ich kann keine bessere Lösung finden, und Getter-Methoden sind besser als meine aktuelle Problemumgehung. –

1
public bool IsPaidInFull 
{ 
    get { return NetTotal <= 0m; } 
    private set { ;} 
} 
+0

Das ist böse ... –

+0

Es muss etwas mit Reflektion zu tun haben, die vom Datenkontext verwendet wird. Ich stelle mir vor, dass der Datenkontext die Reflektion verwendet, um zu überprüfen, ob auf Ihrer Eigenschaft ein Getter und Setter vorhanden ist, überprüft aber nicht den Zugriffsmodifizierer. Und da es den Setter nie wirklich benutzt, gibt es kein Problem mit dem Zugriff. – AndyClaw