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++ 不允许虚拟模板方法的情况下允许虚拟泛型方法?

为啥在这种重载解析情况下编译器不能告诉更好的转换目标? (协方差)

c#中断异步操作

在 C# 中获取 Enumerator.Current 的索引 [重复]

同时播放两个声音c#

如何将对象的唯一副本存储在列表中,在这种情况下是一个半解决的数独单元格的锯齿状数组