如何处理查询没有返回行的数据表的 linq 语句 [重复]

Posted

技术标签:

【中文标题】如何处理查询没有返回行的数据表的 linq 语句 [重复]【英文标题】:How to handle a linq statement that queries a datatable where no rows are returned [duplicate] 【发布时间】:2022-01-13 17:09:45 【问题描述】:

我有一个像这样的简单数据表:

F1   F2
A     1
B     2

我想返回 F2 的值,其中 F1 是某个值。此代码在行存在时有效:

DataTable dt = null;
DataRow dr = null;
string strTemp = null;

//define datatable
dt = new DataTable();
dt.Columns.Add("F1");
dt.Columns.Add("F2");

//add 2 rows
dr = dt.NewRow();
dr["F1"] = "1";
dr["F2"] = "A";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["F1"] = "2";
dr["F2"] = "B";
dt.Rows.Add(dr);

//this returns "A"
strTemp =
    dt.AsEnumerable().
    Where(x => x.Field<string>("F1") == "1").
    FirstOrDefault().Field<string>("F2");

但是当我尝试搜索一个不存在的值时,我得到一个 value cannot be null 错误:

strTemp =
    dt.AsEnumerable().
    Where(x => x.Field<string>("F1") == "123"). //this gets an error because 123 does not exist
    FirstOrDefault().Field<string>("F2");

我该如何处理? (这也是进行搜索的最佳做法吗?)

【问题讨论】:

这个现有的帖子和回复是否有帮助:***.com/questions/48350739/… 不,抱歉,它没有。 “我该如何处理?”在询问 F2 字段的值之前检查空值。有多种方法可以做到这一点,具体取决于您希望 strTemp 在该场景中的值。 FirstOrDefault()?.Field&lt;string&gt;("F2") 是最简单的,但您需要确保自己知道为什么它有效。 @ D Stanley - 是的,这基本上是我的问题。如何检查没有返回记录? 【参考方案1】:

像这样:

var strTemp =
    dt.AsEnumerable()
    .FirstOrDefault(x => x.Field<string>("F1") == "123")
    ?.Field<string>("F2");

出错的不是.Where;这是对从.FirstOrDefault() 返回的空值调用.Field() 的尝试。如果您改用?.Field,则如果FOD 返回null,则实际上不会调用该方法,它会直接将strTemp 设置为null。有关详细信息,请参阅精美手册中的null conditional operators

(所以在使用 strTemp 之前请记住这一点)

如何检查没有返回记录?

这是一个稍有不同的问题,可能已被上述排除,但如果您想了解其他情况,可以查看Enumerable.Any

这也是进行搜索的最佳做法吗?

对于数据表,搜索主键会更高效,或者如果您将在列中进行大量搜索,则可以使用以下方法对其进行索引:

var lu = table.Rows.Cast<DataRow>().ToLookup(r => (string)r["F1"])

这将生成一个查找,您可以使用它来快速搜索 F2 中带有“Hello”的所有 DataRow:

foreach(var ro in lu["Hello"])
  ...

【讨论】:

完美。谢谢! @Madison320 NP。我还添加了您询问的其他一些内容..

以上是关于如何处理查询没有返回行的数据表的 linq 语句 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 Grafana 中,我们如何处理在图表/面板中返回 0 行的查询?

使用 LINQ to SQL 时如何处理 SqlException“未找到记录”?

SQLServer中游标是如何处理数据的?

如何处理 JPQL 查询返回的 Object 类型?

如何处理在域模型中没有表示的查询?

C#/JSON 如何处理从数据库查询返回的 NULL 值? [复制]