如何在MVC中检测或处理Null查询结果?

时间:2014-04-07 00:55:28

标签: c# entity-framework asp.net-mvc-4

以下代码适用于已登录用户的信用卡表中已有记录的情况;但是,当用户在信用卡表中没有条目时,查询会按预期找到零记录。问题是,语句maxccid = query.Maxccid();返回Null并抛出InvalidOpeation异常。我不能使数据库中的ccid字段为空,因为它是主键的一部分。我需要一种方法来检测这个查询是否会在我运行它之前返回null,或者是一种捕获它的方法(最好没有try catch,因为这种情况会发生在每个新客户身上(Try / Catch的最佳实践状态这是没有正确使用Try / Catch。。只需添加一条注释即可使用Entity Framework。

更新4/9/14:我修改了查询以解决我在评论中向Usesr FailedProgramming和Mike报告的问题。我仍然有空问题。

// Create CreditCard - Write to DB
    public ActionResult Create(CreditCard model)
    {
        EntitiesContext context = new EntitiesContext();
        int uid = (int)WebSecurity.GetUserId(User.Identity.Name);  // Currently logged-in user
        short? maxccid = 0; //this will be the max ccid for this user

        var query = from c in context.CreditCards
                    where c != null && c.UserId == uid select c.CCID;
        maxccid = query.Max();

2 个答案:

答案 0 :(得分:1)

if(query.Any())
     maxccid = query.Max();

答案 1 :(得分:0)

首先使用using作为数据库对象 其次,使用null-coalescing运算符。处理空值
在这里查看http://msdn.microsoft.com/en-us/library/ms173224.aspx

public ActionResult Create(CreditCard model)
{

    using(EntitiesContext context = new EntitiesContext()) // using keyword will dispose the object properly.
    {
        int uid = (int)WebSecurity.GetUserId(User.Identity.Name);  // Currently logged-in user
        short? maxccid = 0; //this will be the max ccid for this user

        var query = from c in context.CreditCards 
                where c.UserId == uid && c.CCID == (context.CreditCards.Max(c1 => c1.CCID) ) select c.CCID ;
        maxccid = query.Max() ?? 0; //use null-coalescing operator.
    }


}

您可以根据需要更多地优化此代码。 希望,它可能在某些方面帮助你。祝你有愉快的一天。