【问题标题】:How do I know if my linq will return a useable object or a null我如何知道我的 linq 是否会返回可用对象或 null
【发布时间】:2019-06-06 21:26:35
【问题描述】:

我正在开发一项网络服务。我正在使用 linq 查询数据库。看似简单,但我遇到了一个问题。这是我的参考代码:

List<Comment> res = new List<Comment>();

using (ApplicationHistoryEntities ahe = new ApplicationHistoryEntities())
{
     res = (from columns in ahe.Comments
        where columns.NetforumId == actionuniqueid
            select columns).ToList();
}

如果我在数据库中没有条目,我的 .ToList() 会抛出错误吗?我可以部署它,然后尝试一下,但我想更多地了解我的 linq 正在使用的机制。如果 ahe.Comments 数据库没有行... (from...) 部分将返回什么?

我可以添加一个空引用检查,使用动态等,但我想真正理解它。

我发现了这个问题:how to know if my linq query returns null,但似乎所有的答案都与真正应该如何做相冲突......

示例答案:

  1. 您可以将其转换为列表,然后检查计数
  2. 最好的方法是使用 Any() 而不是 count() 检查列表中是否存在 null(无项目)
  3. LINQ 查询永远不应该返回 null,如果结果为空,您也不应该得到异常。您的代码中可能有错误。
  4. 您可以将结果实现为列表,然后检查项目。

你可以明白我为什么质疑它的工作原理。

编辑: 最终代码如下所示:

List<Comment> res;
using (ApplicationHistoryEntities ahe = new ApplicationHistoryEntities())
{
    res = ahe.Comments?.Where(rowItem => rowItem.NetforumId == actionuniqueid).ToList() ??
          new List<Comment>().ToList();
}

【问题讨论】:

  • 如果ahe.Comments 中没有行,.ToList() 不会抛出任何错误。是的,你可以使用 .Any()

标签: linq return-value


【解决方案1】:

看这个例子:

List<string> test = new List<string>();
var test1 = test.Where(x => x == "a").ToList();

如果test 存在但为空,则查询返回一个空列表。如果testnull,则查询会引发错误。因此,您可以按如下方式调整查询

List<string> test = new List<string>();
test = null;
var test1 = test?.Where(x => x == "a") ?? new List<string>().ToList();

查询现在是“安全的”。上述两个示例都返回一个空列表,即test1.Count() 将返回零但仍可用。

你也可以看看WhereToList的定义

【讨论】:

  • 感谢学术回答。我很感激。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-28
  • 1970-01-01
  • 2021-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多