Leeres linq-Ausdruck zurückgeben

7

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?

    
Umair 03.09.2013, 13:14
quelle

4 Antworten

16

LINQs Entsprechung von 1=1 "dingy" des SQL ist ein Prädikat, das immer true zurückgibt:

%Vor%

Ändern Sie Ihre Standardmethode wie folgt:

%Vor%     
dasblinkenlight 03.09.2013, 13:16
quelle
5

Sie können einfach überprüfen, ob die geerbte Eigenschaft null zurückgibt:

%Vor%

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.

    
O. R. Mapper 03.09.2013 13:17
quelle
2

Sie können Folgendes tun:

%Vor%

Dies ist ein Ausdruck, der immer wahr zurückgibt.

    
Piotr Stapp 03.09.2013 13:20
quelle
0

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)))

    
ModMa 23.09.2014 20:27
quelle

Tags und Links