如何处理查询没有返回行的数据表的 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<string>("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 行的查询?