6

我有以下代码

    return
    this.Storage.Customer.OfType<Preferred>()
    .Include(b  => b.Order)
    .Where(cust => cust.Id == customerId && cust.CustomerType== (int)cusType)
    .SingleOrDefault();

可以改写如下,去掉where。

    return
    this.Storage.Customer.OfType<Preferred>()
    .Include(b  => b.Order)
    .SingleOrDefault(cust => cust.Id == customerId && cust.CustomerType == (int)cusType);

哪一个是更好的做法,为什么?

4

3 回答 3

2

由于调试函数返回值的复杂性,以及在调试器中无法使用 lambda 表达式,这是最好的方法:

var temp = this.Storage.Customer.OfType<Preferred>()
    .Include(b  => b.Order)
    .Where(cust => cust.Id == customerId && cust.CustomerType == (int)cusType);

return temp.SingleOrDefault();

这样,如果出现异常(如果您正在执行复杂的表达式,这很常见),您可以在监视面板中SingleOrDefault()的 and do 上放置一个断点:returntemp.ToList();

于 2013-08-27T08:55:01.097 回答
1

首先你需要了解区别

this.Storage.Customer.OfType<Preferred>()
.Include(b  => b.Order)
.Where(cust => cust.Id == customerId && cust.CustomerType== (int)cusType)

这只会创建一个查询,但在您调用 ToList 方法之前不会执行。

SingleOrDefault 方法将实际执行查询。因此,如果您想在查询执行之前对其进行检查或执行某些操作,您应该使用 where 然后调用 SingleOrDefault。

所以总的来说,根据我的个人意见,使用 where 是好的做法

于 2013-08-27T09:17:23.213 回答
0

旧帖子,这在很大程度上是基于意见的,但这是上面没有提到的另一个考虑因素:

SingleOrDefault子句后面不能跟其他术语,Select因为正如上面 Patel 所指出的,它实际上执行了查询。例如,说您想修改查询以仅返回客户姓名:

this.Storage.Customer.OfType<Preferred>()
.Include(b  => b.Order)
.SingleOrDefault(cust => cust.Id == customerId && cust.CustomerType == (int)cusType)
.Select(cust=>cust.Name); //compile error

将不起作用,并且您不能将Select子句移到之前,SingleOrDefault因为然后IdandCustomerType字段对SingleOrDefault. 相反,您需要先添加回该Where子句:

this.Storage.Customer.OfType<Preferred>()
.Include(b  => b.Order)
.Where(cust => cust.Id == customerId && cust.CustomerType == (int)cusType)
.Select(cust=>cust.Name)
.SingleOrDefault();

因此,由于该Where子句通常是必要的,并且始终至少具有良好的性能,因此始终将其用于一致性、可读性和可维护性可能是一种好习惯。

于 2017-08-18T15:20:54.563 回答