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将返回默认的空对象。这种行为避免抛出一个与第一个或单个相反的例外,即如果您不匹配任何巧合就会抛出一个错误。谢谢。非常有用的表格。非常感谢,很好的链接。