我有以下代码
return
this.Storage.Customer.OfType<Preferred>()
.Include(b => b.Order)
.Where(cust => cust.Id == customerId && cust.CustomerType== (int)cusType)
.SingleOrDefault();
可以重写如下,消除其中。
return
this.Storage.Customer.OfType<Preferred>()
.Include(b => b.Order)
.SingleOrDefault(cust => cust.Id == customerId && cust.CustomerType == (int)cusType);
哪一种更好的做法,为什么?
答案 0 :(得分: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()
上存在异常(如果您正在执行复杂的表达式,这是非常常见的),您可以在return
上设置断点并在监视面板中执行: temp.ToList();
答案 1 :(得分:1)
首先,您需要了解差异
this.Storage.Customer.OfType<Preferred>()
.Include(b => b.Order)
.Where(cust => cust.Id == customerId && cust.CustomerType== (int)cusType)
这只会创建一个查询但不会执行,直到你调用ToList方法。
SingleOrDefault方法实际上将执行查询。因此,如果您想在查询执行之前检查或执行某些操作,则应使用where,然后调用SingleOrDefault。
总的来说,根据我的个人意见,使用哪里是好的做法
答案 2 :(得分: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
之前,因为Id
和CustomerType
字段将无法显示SingleOrDefault
中的lambda表达式。相反,您需要先添加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
子句通常是必要的,并且始终至少具有良好的性能,因此始终将其用于一致性,可读性和可维护性可能是一种好习惯。