.Single或Default with condition或Where子句

时间:2013-08-27 08:24:38

标签: c# .net entity-framework

我有以下代码

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

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

3 个答案:

答案 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之前,因为IdCustomerType字段将无法显示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子句通常是必要的,并且始终至少具有良好的性能,因此始终将其用于一致性,可读性和可维护性可能是一种好习惯。