【问题标题】:How to handle nulls in this LINQ Code using a possible null List?如何使用可能的空列表处理此 LINQ 代码中的空值?
【发布时间】:2013-10-10 18:31:03
【问题描述】:

我正在使用 MVC3、Razor、C#。

我有一些包含一些 LINQ 的 Razor 代码。它尝试从列表中获取值。有时列表为空。目前,应用程序因此引发了一个空异常,即“myCustomers”为空。

代码:

Model.myCustomers.First().Name

基本上“myCustomers”定义为:

public List<Customer> myCustomers

并由“LINQ to Entity”查询填充。

如果“myCustomers”为空,如何确保剃须刀代码不会崩溃。我不想为每个属性写很多“if (Name!=null)”类型的块。由于布局设计问题,我无法遍历所有属性。所以我需要改变:

Model.myCustomers.First().Name

以某种方式。

希望这个问题不会太令人困惑!

非常感谢。

编辑 1

我喜欢不返回空值而是空列表的逻辑。我尝试使用类似

return this._myCustomers ?? Enumerable.Empty<Customers>().ToList(); 

最好有办法在 Razor 页面的 LINQ 的一行中测试它是否为空,而不是在“IF”块中。

编辑 2

    public static TValue SafeGet<TObject, TValue>(
        this TObject obj,
        Func<TObject, TValue> propertyAccessor)
    {
        return obj == null ? default(TValue) : propertyAccessor(obj);
    }

所以:

   Model.myCustomers.FirstOrDefault().SafeGet(m=>m.Name)

【问题讨论】:

  • myCustomers 也可以是一个空列表吗?如果可能的话,您还必须检查这一点,否则First() 将引发异常。

标签: c# asp.net-mvc asp.net-mvc-3 linq linq-to-entities


【解决方案1】:

如果你的收藏不是null,那么在你的razon视图中你可以使用

 Model.myCustomers.Any() ? Model.myCustomers.First().Name : string.Empty;

如果由于某种原因你不能避免你的收藏为空,我想你可以这样做。

 Model.myCustomers == null ? string.Empty : Model.myCustomers.Any() 
       ? Model.myCustomers.First().Name : string.Empty;

【讨论】:

  • 谢谢。完全理解逻辑。我最终使用了一种扩展方法,使其更加简洁。再次感谢。
【解决方案2】:

由于布局设计问题,我无法遍历所有属性。

我不是很清楚这意味着什么,但你能不能不做这样的事情?

@if (Model.myCustomers == null || !Model.myCustomers.Any())
{
    <p>No customer found.</p>
}
@else
{
    [ put the markup for each property here ]
}

【讨论】:

  • 谢谢。这确实给了我复制和粘贴 2 位 HTML 的想法,一个用于存在的记录,另一个用于不存在的记录。但是,代码可能会有些重复。再次感谢。
【解决方案3】:

Collection or enumerable should never return null value for best practice.

一旦您确定 myCustomers 不为空,您只需检查 myCustomers 的第一项不为空。

var customer = Model.myCustomers.FirstOrDefault();
if (customer != null)
{
   var name = customer.Name;
}

【讨论】:

  • 我喜欢这里的逻辑,并在 EDIT 1 中添加了代码。只是试图在一行而不是“if”块中测试这个“空”代码。这不可能吗?非常感谢。
  • return this._myCustomers ?? new List&lt;Customers&gt;(); 也可以。
  • 好的,谢谢。是的,我发现了这一点。我怎么能在 Razor 视图中使用我的一个衬垫,它可以检查这会产生的空列表。如果找到然后可能什么也不写。我宁愿不使用“if”块,而是使用更简洁的东西?
  • 我使用了一个我忘记了的扩展方法,但最初来自 SO,所以我将它发布在 EDIT2 下。有趣的是,由于我正在编写 Razor 视图,因此可以选择只创建 2 个 HTML 块,一个在记录存在时进行处理,另一个在记录不存在时进行处理。很明显,可以在聪明的 LINQ 或复制/粘贴 HTML 之间进行选择,尽管后者很简单,但它确实看起来更重复且不那么雄辩。再次感谢。从这个问题中学到了很多
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多