如果我想在我的数据库中找到确切的搜索结果,我应该用什么来代替“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如何工作的理解是错误的?
您似乎不太了解==
运算符在这种情况下的工作原理。 假设UserName
和Name
值都是string
则==
将执行精确的序号匹配。 "MrUser"
的名称根本不"MrUserOne"
匹配。 它只会匹配"MrUser"
.
话虽如此,此代码将返回其Name
值与o.UserName
或null
(如果没有)完全匹配的第一个用户。
JaredPar说的非常正确。但是,如果您期望的只是一个结果,也可以使用 SingleOrDefault。您可以在此 Stackoverflow 问题中阅读有关此内容的更多信息:LINQ:何时使用带有筛选条件的 SingleOrDefault 与 FirstOrDefault()
您的查询将只返回UserName
与User.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"的第一个用户。