Linq检查是否为null并发送到razor视图

时间:2014-04-16 10:07:48

标签: asp.net-mvc linq

我正在开发我的第一个MVC应用程序,其中我使用Linq查询我的数据库。

我在查询下面遇到问题。

indexModel.MostValuablePurchased = (from purch in db.Purchases
                            where purch.UserId == WebSecurity.CurrentUserId
                             && purch.DateBought.Value.Year == DateTime.Now.Year
                             orderby purch.Price descending
                             select purch.TagNo).FirstOrDefault();

对于拥有数据的用户,它会按预期执行。但是当查询返回null时,当它到达带有错误的剃刀视图时会崩溃,并且#34;值不能为空或空。"

处理这种情况的最佳方法是什么。 谢谢

2 个答案:

答案 0 :(得分:1)

它完全取决于您的应用程序和数据的业务规则,您可以在代码或视图中处理它。记住MVC设计模式的好处很重要,考虑到这一点,您可能不希望在视图中处理它,以便业务逻辑与数据表示分离。

例如,一种方法是创建一个变量来保存查询的值:

var mostValuablePurchased = (from purch in db.Purchases
                                            where purch.UserId == WebSecurity.CurrentUserId && purch.DateBought.Value.Year == DateTime.Now.Year
                                            orderby purch.Price descending
                                            select purch.TagNo).FirstOrDefault();

然后适当地设置您的模型值

indexModel.MostValuablePurchased = mostValuablePurchased ?? 0;

显然,如果查询为null,您将需要将0替换为所需的任何默认值。此示例假设您要显示默认值,并且MostValuablePurchased是一个整数。

答案 1 :(得分:0)

请试试这个

if (WebSecurity.CurrentUserId!=null){

indexModel.MostValuablePurchased = db.Purchases.Where(o => o.UserId == WebSecurity.CurrentUserId && o.DateBought!=null && o.DateBought.Value.Year == DateTime.Now.Year && o.TagNo!=null).Max(o=>o.Price).TagNo;}