Nullable类型和.HasValue仍然会抛出Null异常

时间:2016-07-13 15:12:38

标签: c# linq

我有一个描述存储的各种电话的类。有时Importance属性可以为null。这是班级

public class PhoneTypeListInfo
{
    public string AccountNum { get; set; }
    public int PhoneType { get; set; }
    public string PhoneNum { get; set; }

    public int Importance { get; set; }
}

如果电话号码和帐号与给定的一组值匹配,我已经定义了一个返回PhoneTypeListInfo的函数。

    protected PhoneTypeListInfo RetrievePhoneType(string info, string acctNumber)
    {
        PhoneTypeListInfo type = xPhoneTypeList.Where(p => p.PhoneNum == info && p.AccountNum == acctNumber).FirstOrDefault();

        return type;
    }

这一切都很棒。我遇到的问题是下面的linq查询。

List<AlertBasedPhones> xAccountPhones = new List<AlertBasedPhones>();
xAccountPhones = (from x in xAccountStuff
                  where x.Media == "Phone"
                  let p = RetrievePhoneType(x.Info, acct.AccountNumber)
                  let xyz = x.Importance = (p.Importance as int?).HasValue ? p.Importance : 0
                  orderby p.Importance descending
                  select x).ToList();

我上面所做的是尝试使用具有不同构图的不同类,除了获得重要性&#39;来自PhoneTypeListInfo的属性。

我的问题最终是,我需要做什么才能使p.Importance为空,如果为空则将其设置为0,同时使x.Importance为0。

2 个答案:

答案 0 :(得分:6)

p.Importannce不是p,而是?.本身。这是你需要首先检查null的事情。如果您使用的是C#6,则可以使用(p.Importance as int?).HasValue ? p.Importance : 0运算符。您还可以将p.Importance ?? 0的逻辑简化为List<AlertBasedPhones> xAccountPhones = new List<AlertBasedPhones>(); xAccountPhones = (from x in xAccountStuff where x.Media == "Phone" let p = RetrievePhoneType(x.Info, acct.AccountNumber) let xyz = x.Importance = p?.Importance ?? 0 orderby p?.Importance descending select x).ToList(); 。将两者结合起来

DO
$body$
DECLARE
  v_name_short VARCHAR;
BEGIN

v_name_short := 'test Account 1';

     RETURN QUERY
        SELECT 
            a.name_short, 
            a.name_long
        FROM enterprise.account a 
        WHERE 
            CASE WHEN v_name_short IS NOT NULL THEN
               LOWER(a.name_short) = LOWER(v_name_short)
            ELSE
               1 = 1   
            END;
END;
$body$
LANGUAGE 'plpgsql';

答案 1 :(得分:2)

使用三元运算符。将p.Importance替换为(null==p) ? 0 : p.Importance