Ich habe eine WhereFilter-Eigenschaft in einer Basisklasse wie folgt:
%Vor%Wenn es überschrieben wird, möchte ich etwas anderes anstelle von null zurückgeben, damit ich die Prädikatbuilder-Erweiterung und (aus LinqKit ), damit ich meinen Code wie folgt schreiben kann:
%Vor%Aber das ergibt einen Fehler, da WhereFilter null ist (Objektreferenz nicht auf eine Instanz eines Objekts gesetzt).
Momentan schreibe ich als:
%Vor%Wenn also eine andere untergeordnete Klasse dies außer Kraft setzt, geht die Basisklasseneigenschaft verloren.
Irgendeine Möglichkeit, das zu lösen? In sql, was ich getan habe, war ein Dummy, wo 1 = 1 dingy, kann dies ähnlich hier in linq getan werden?
LINQs Entsprechung von 1=1
"dingy" des SQL ist ein Prädikat, das immer true zurückgibt:
Ändern Sie Ihre Standardmethode wie folgt:
%Vor% Sie können einfach überprüfen, ob die geerbte Eigenschaft null
zurückgibt:
IMO das wird besser lesbar sein als scheinbar sinnlose Dummy-Werte, die Sie (oder irgendjemanden, der mit dem Code arbeitet) sich zu einem späteren Zeitpunkt fragen, was das ist. (Und es wird wahrscheinlich sogar ein bisschen weniger Overhead beim Laufen führen.)
Wenn Sie darauf bestehen, weniger Zeilen zu verwenden, können Sie den Ausdruck if
- else
verkürzen, indem Sie den Operator ?:
verwenden.
EDIT: Wenn Sie noch ein wenig weiter darüber nachdenken, könnten Sie es als einen Nachteil betrachten, dass jeder, der diese Eigenschaft überschreibt, so viel Code schreiben muss, was zu Fehlern führen kann. Aber es ist eine fragwürdige Design-Entscheidung, sich auf übergeordnete Methoden zu verlassen, die keine solchen Fehler enthalten, wenn Sie den vererbten Code aufrufen, wie bei dem von Ihnen vorgeschlagenen Modell, können Overpirer genauso gut nur ihr neues Prädikat zurückgeben, ohne And
aufzurufen.
Ein saubereres Design, IMO, würde die virtuelle Eigenschaft protected
machen und nur das neue Prädikat (oder null
) zurückgeben. Die öffentlich zugängliche (und nicht virtuelle) Eigenschaft wäre dann dafür verantwortlich, alle Prädikate der aktuellen und aller Oberklassen abzurufen und sie mit And
zu kombinieren, wenn es mehr als eine gibt.
Sie können Folgendes tun:
%Vor%Dies ist ein Ausdruck, der immer wahr zurückgibt.
Wenn Sie sich im Debug befinden, können Sie keine Lambda-Ausdrücke (EF) verwenden. Sie können dies verwenden, um eine Linkliste zu betrügen. Wenn Sie eine Standard-Linq verwenden, verwenden Sie diesen Satz mit .Compile () am Ende:
Ausdruck & gt; .Lambda (Expression.Constant (true), Expression.Parameter (typeof (T)))