C# 我应该用什么来代替“引用”;FirstOrDefault();如果我想在我的数据库中找到准确的搜索结果?

C# 我应该用什么来代替“引用”;FirstOrDefault();如果我想在我的数据库中找到准确的搜索结果?,c#,asp.net-mvc,asp.net-mvc-3,entity-framework,C#,Asp.net Mvc,Asp.net Mvc 3,Entity Framework,我当前正在控制器中使用以下代码: Instructor instructor = db.Instructors.FirstOrDefault( o => o.UserName == User.Identity.Name); 按用户名选择某人。我的理解是,如果我有类似用户名的用户(即,当我有名为“MrUserOne”、“MrUserTwo”和“MrUser”的用户时,搜索“MrUser”可能会产生“MrUserOne”,因为这是“第一个”出现的搜索结果),我将很难使用“FirstO

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

Instructor instructor = db.Instructors.FirstOrDefault(
    o => o.UserName == User.Identity.Name);
按用户名选择某人。我的理解是,如果我有类似用户名的用户(即,当我有名为“MrUserOne”、“MrUserTwo”和“MrUser”的用户时,搜索“MrUser”可能会产生“MrUserOne”,因为这是“第一个”出现的搜索结果),我将很难使用“FirstOrDefault()”,如果我对未来的困难理解正确的话“FirstOrDefault,”我应该在它的位置上使用什么


或者我对FirstOrDefault如何工作的理解有误吗?

您似乎不太理解
=
操作符在这种情况下是如何工作的。假设
用户名和
名称都是
字符串
,那么
=
将进行精确的顺序匹配“
”MrUserOne“
完全不匹配。它将只匹配
“MrUser”


也就是说,此代码将返回其
Name
值与
o.UserName
完全匹配的第一个用户,如果没有匹配,则返回
null

当您使用==,您已经在进行精确的搜索结果。表情

o => o.UserName == User.Identity.Name
翻译成

WHERE UserName = [Username]
在数据库方面。这不能与这样的说法混淆

o => o.UserName.Contains(User.Identity.Name)
这就意味着

WHERE UserName like '%[Username]%'
有关如何将Linq的字符串函数转换为实体的信息,请参见


也就是说,FirstOrDefault将为您提供与您提供的用户名完全匹配的名字。因此,您的示例将第一个用户与名称“MrUser”匹配。

JaredPar的说法非常正确。但是,如果您期望的结果正好是一个结果,那么也可以使用SingleOrDefault。您可以在这个Stackoverflow问题中了解更多信息:

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

因此,如果有两个名称相同的用户,则返回值仅为第一个。“第一个”可能不同,这取决于数据库返回结果时的感觉(因为您没有指定顺序)

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

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

我相信您的意思是,
其中UserName=[UserName]
——您的SQL片段中有一个双等于运算符,而不是一个。谢谢你的接球!非常感谢=这正是我需要知道的。您也可以使用First()或Single()。如果没有任何匹配项,FirstOrDefault将返回默认的空对象。这种行为避免抛出一个与第一个或单个相反的例外,即如果您不匹配任何巧合就会抛出一个错误。谢谢。非常有用的表格。非常感谢,很好的链接。