C# - 在这种情况下 FirstOrDefault() 是不是返回 null?
Posted
技术标签:
【中文标题】C# - 在这种情况下 FirstOrDefault() 是不是返回 null?【英文标题】:C# - Does FirstOrDefault() return null in this case?C# - 在这种情况下 FirstOrDefault() 是否返回 null? 【发布时间】:2021-12-31 22:05:14 【问题描述】:我希望这个问题尊重 *** 准则。
我的数据库(SQL Server 管理工作室)中有一个表(ResultsTable
),其中的列是:
ID (PK, FK, int, not null)
RiskRate (PK, int, not null)
FileName (PK, nvarchar(100), not null)
在 C# 中,我使用了 EF
。在我的代码中,有一个方法SelectFileNames(string fileName)
:
var resultSearch = (from result in DB.ContextManagement.ResultTable
where result.FinaName.compareTo(fileName) == 0
select result).FirstOrDefault();
if (resultSearch == null)
...
else
...
FirstOrDefault()
方法有这样的描述:
Returns the first element of the sequence that satisfies a condition
or a default value (TSource) if no such element is found.
那么,如果没有具有该文件名的元素,我如何强制FirstOrDefault()
返回null
?注意:在我的表ResultTable
中,列具有not null
约束。
谢谢。
【问题讨论】:
如果result
是引用类型,则返回null
。
resultSearch 是 ResultTable 类型。 result 也是 ResultTable 类型。
C# 中有引用类型 (class
) 和值类型 (struct
)。没有 ResultTable 类型这样的东西。那可能是一个类型的name?
是的,这是一个引用类型。 :P 列的可空性与此处无关。在极少数情况下,您选择了不可为空的值类型,但您仍然想要 null
结果,您可以在 .FirstOrDefault()
之前插入 Cast<int?>()
或类似的东西。
你真的检查过它是否返回null
吗?它应该这样做
【参考方案1】:
如果在您的查询中
(from result in DB.ContextManagement.ResultTable
where result.FinaName.compareTo(fileName) == 0
select result)
没有实体尊重您的条件,那么FirstOrDefault
将返回null
。
在documentation中指定
"备注 引用类型和可空类型的默认值为 null。"
由于result
的类型是引用类型,它将返回null
。
【讨论】:
谢谢。我读过文档,我对 TSource 源为空与源为空感到困惑【参考方案2】:您可以使用以下语法
var resultSearch = DB.ContextManagement.ResultTable.Where(x => x.FileName == fileName).ToList() ;
if (resultSearch.Count > 0)
...
else //Get the first element of list
【讨论】:
resultSearch
在这种情况下永远不会是 null
。如果结果为零,您将有一个空列表。
我忘了修改if语句,目的是检查resultSearch是否为null,这里相当于.Count>0【参考方案3】:
像这样试试。
List<Users> userlist = new ();
userlist.Add(new Users() username = "testuser",password = "testpass");
userlist.Add(new Users() username = "testuser2", password = "" );
var result = userlist.FirstOrDefault(s => s.username == "testuser2")?.password;
【讨论】:
以上是关于C# - 在这种情况下 FirstOrDefault() 是不是返回 null?的主要内容,如果未能解决你的问题,请参考以下文章
C# 如何在 C++ 不允许虚拟模板方法的情况下允许虚拟泛型方法?
为啥在这种重载解析情况下编译器不能告诉更好的转换目标? (协方差)