2012-04-05 7 views
2

Ich habe eine Frage über die gängige Praxis des Schreibens von linq Abfragen. Eigentlich hatte ich einen Streit mit meinem Kollegen.Linq Codierung Stil: Inline, wenn

Wir haben eine boolesche Variable, falls sie wahr ist - zusätzliche Überprüfung ist erforderlich. falls es falsch ist, sollte es keinen solchen Check geben.

Es gibt 2 Wege es in Linq zu implementieren:

bool onlyForReturningCustomers;  
.....  
return context.Products.Where(product => product.StartTime >= fromDate 
           && product.StartTime < toDate 
           && (onlyForReturningCustomers ? product.IsReturningClient : true)); 

und die zweite:

bool onlyForReturningCustomers; 
.....    
var q = context.Products.Where(product => product.StartTime >= fromDate && product.StartTime < toDate); 

if (onlyForReturningCustomers) { 
    q = q.Where(product => product.IsReturningClient); 
} 
return q; 

Die erste macht case Anweisung in SQL und wenn onlyForReturningCustomers=false die Aussage wie 1=1 erscheint aber diese Code wird viel einfacher gelesen.

Die zweite ist nicht so einfach zu lesen, aber es macht klare Aussage in SQL ohne jeden Kram.

Welchen würden Sie verwenden?

+2

Es scheint, als ob Sie bereits die Tools/Kenntnisse haben, um dies zu beantworten. –

Antwort

3

könnte ich für

bool onlyForReturningCustomers; 
.....    
// Make a positively-named variable 
bool includeAllCustomers = !onlyForReturningCustomers; 
var q = context.Products.Where(product => product.StartTime >= fromDate 
             && product.StartTime < toDate 
             && (includeAllCustomers 
              || product.IsReturningClient)); 

return q; 

gehen, die im Grunde die gleiche wie Ihre erste Weg ist, aber ohne die Kuriosität eines bedingten Ausdrucks, wo ein Zweig true gerade sagt.

+0

Warum haben Sie nicht nur (! OnlyForReturningCustomers || product.IsReturningClient) getan? Speichert mit einer Variablen :) – mattytommo

+0

@mattytommo als stilistische Sache, ich bevorzuge boolean Bedingungen ausgedrückt/konsumiert werden ** positiv **, die ich glaube, hilft Verständnis. Ich denke, es gibt ein paar Sachen in Code Complete (sorry, habe es jetzt nicht zur Hand) – AakashM

+0

ah fair genug, ich stimme dem zu :). +1 für Ihre Antwort – mattytommo

0

Ich würde die erste verwenden, weil es aussieht wie die zweite Option ist eigentlich zwei Rundreisen zu den Daten.

Ich würde auch die SQL durch die LINQ-Anweisung emittiert kopieren, fügen Sie ihn in Ihre Lieblings-SQL-Tool (zB SQL Server Management Studio), fügen SET STATISTICS IO ON über dem SELECT Anweisung und untersuchen die logische liest notwendig, um die Abfrage auszuführen (weniger ist besser).

+3

Es sollten keine zwei Round-Trips erforderlich sein: LINQ-Abfragen werden normalerweise zurückgestellt, bis Sie tatsächlich nach den Ergebnissen gefragt haben. – LukeH

4

Die zweite Anweisung ist leichter zu lesen und auch einfacher zu warten, wenn Sie in der Zukunft Geschäftsregeln für die Rückgabe von Kunden oder anderen Kundentypen hinzugefügt hätten.