C# 实体框架不返回null

C# 实体框架不返回null,c#,entity-framework,C#,Entity Framework,我有点糊涂了。如果我的查询没有返回任何内容,为什么优惠券不是空的?我应该如何检查空值 Coupon coupon; using (var db = new KupongEntities()) { coupon = (from p in db.Coupon where p.CouponID == 123 select p).SingleOrDefault(); } if (coupon != null) { //test } 如果我的查询没有返

我有点糊涂了。如果我的查询没有返回任何内容,为什么优惠券不是空的?我应该如何检查空值

Coupon coupon;

using (var db = new KupongEntities())
{
    coupon = (from p in db.Coupon
        where p.CouponID == 123
        select p).SingleOrDefault();
}

if (coupon != null)
{
    //test
}
如果我的查询没有返回任何内容,为什么优惠券不是空的

你的问题有点令人困惑。您的意思是,尽管您认为不应该有结果,但您正在执行该查询并没有得到
null
值吗?然后发生了三件事中的一件:

  • 你错了,没有结果
  • 没有结果是对的,但返回的值不是
    null
    是错的
  • 优惠券
    是一个结构
  • 我给你一个怀疑的理由,假设1。二,。事实并非如此。在最后一种情况下,
    优惠券
    将接收
    优惠券
    实例的默认值。结构的默认值是将结构的所有字段设置为默认值的值。在这种情况下,你应该说

    if(coupon != default(Coupon)) {
    }
    
    但是,还有一个棘手的问题,
    优惠券
    的默认实例可能是数据库中的有效条目。如果我是你,我会重新考虑制作优惠券

    我应该如何检查空值

    Coupon coupon;
    
    using (var db = new KupongEntities())
    {
        coupon = (from p in db.Coupon
            where p.CouponID == 123
            select p).SingleOrDefault();
    }
    
    if (coupon != null)
    {
        //test
    }
    

    好吧,如果
    优惠券
    是一种参考类型,那么您所拥有的正是合适的。如果
    优惠券
    是一个结构,您可以按照我上面所示的方式进行检查。

    您使用的是SingleOrDefault,因此它将返回优惠券实例,如果在集合中未找到任何内容,则返回null。它将实际返回默认值(优惠券),它“可能”是一个新优惠券,您可以重新定义对象的默认值