如果我想在我的数据库中找到确切的搜索结果,我应该用什么来代替“FirstOrDefault()”

本文关键字:什么 我应该 FirstOrDefault 搜索结果 我的 数据库 如果 | 更新日期: 2023-09-27 18:31:39

我目前正在控制器中使用以下代码:

Instructor instructor = db.Instructors.FirstOrDefault(
    o => o.UserName == User.Identity.Name);

以按用户名选择某人。 我的理解是,如果我有具有相似用户名的用户,我将在使用"FirstOrDefault()"时遇到麻烦(即当我有名为"MrUserOne"MrUserTwo"和"MrUser"的用户时搜索"MrUser"可能会产生"MrUserOne",因为它是"第一个"搜索结果出现),如果我对"FirstOrDefault"未来困难的理解是正确的,"我应该在它的位置使用什么?

还是我对FirstOrDefault如何工作的理解是错误的?

如果我想在我的数据库中找到确切的搜索结果,我应该用什么来代替“FirstOrDefault()”

您似乎不太了解==运算符在这种情况下的工作原理。 假设UserNameName值都是string==将执行精确的序号匹配。 "MrUser"的名称根本不"MrUserOne"匹配。 它只会匹配"MrUser".

话虽如此,此代码将返回其Name值与o.UserNamenull(如果没有)完全匹配的第一个用户。

JaredPar说的非常正确。但是,如果您期望的只是一个结果,也可以使用 SingleOrDefault。您可以在此 Stackoverflow 问题中阅读有关此内容的更多信息:LINQ:何时使用带有筛选条件的 SingleOrDefault 与 FirstOrDefault()

您的查询将只返回UserNameUser.Identity.Name完全匹配的第一个用户(它不会匹配以 User.Identity.Name 开头的用户,正如您似乎所说的那样)。

因此,如果有 2 个用户具有相同的名称,则返回值将只是第一个。 "第一个"可能不同,具体取决于数据库将结果返回给您时的感觉(因为您没有指定订单)。

作为旁注,您应该熟悉这 4 种类似的方法,它们值得了解:

                   >1 result     0 results
First()            return 1st    throw
FirstOrDefault()   return 1st    return null
Single()           throw         throw
SingleOrDefault()  throw         return null

当你使用 == 时,你已经在做一个精确的搜索结果。 表达式

o => o.UserName == User.Identity.Name

被翻译成

WHERE UserName = [Username]

在数据库端。 不要与这样的陈述混淆

o => o.UserName.Contains(User.Identity.Name)

这将转化为

WHERE UserName like '%[Username]%'

请参阅 http://msdn.microsoft.com/en-us/library/bb738681.aspx,了解如何将字符串函数转换为 Linq 到实体。

话虽如此,您的FirstOrDefault将为您提供与您提供的用户名完全匹配的名字。 因此,您的示例将匹配名称为"MrUser"的第一个用户。