2

我有一个关于编写 linq 查询的常见做法的问题。事实上,我和我的同事发生了争执。

如果它是真的,我们有一个布尔变量 - 需要额外的检查。如果它是假的,就不应该进行这样的检查。

在 linq 中有两种实现方式:

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

第二个:

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

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

第一个case在 sql 中呈现语句,当onlyForReturningCustomers=false语句 like1=1出现但这段代码更容易阅读。

第二个不是那么容易阅读,但它在 sql 中呈现清晰的语句,没有任何垃圾。

你会用哪一个?

4

3 回答 3

4

如果您将来为回头客或其他类型的客户添加业务规则,则第二个语句更易于阅读,也更易于维护。

于 2012-04-05T09:36:10.143 回答
4

我可能会去

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;

这与您的第一种方式基本相同,但没有一个分支只是说的条件表达式的奇怪之处true

于 2012-04-05T09:29:26.377 回答
0

我会使用第一个,因为看起来第二个选项实际上是数据的两次往返。

我还将复制 LINQ 语句发出的 SQL,将其粘贴到您最喜欢的 SQL 工具(例如 SQL Server Management Studio)SET STATISTICS IO ON中,在语句上方添加SELECT并检查执行查询所需的逻辑读取(越低越好)。

于 2012-04-05T09:33:27.417 回答