关于c#:如果我想在我的数据库中找到确切的搜索结果,我可以用什么代替“FirstOrDefault()”?

What do I use in place of “FirstOrDefault()” if I want to find an exact search result in my database?

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

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

按用户名选择某人。我的理解是,如果我有相似用户名的用户(即当我有名为"mruserone"、"mrusertwo"和"mruser"的用户时,搜索"mruser"可能会产生"mruserone",因为这是要显示的"first"搜索结果),如果我对"first or"的未来困难的理解是正确的,我将无法使用"firstordefault()"。默认,"我应该在它的位置使用什么?"

或者我对第一个或第二个结果如何工作的理解是错误的?


您似乎不太了解==运算符在这种情况下的工作方式。假设UserNameName的值都是string,那么==将进行精确的顺序匹配。名称"MrUser"根本不匹配"MrUserOne"。它只与"MrUser"匹配。

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


贾雷德帕说的很对。但是,如果您期望的结果正好是一个结果,那么也可以使用singleOrDefault。您可以在这个stackOverflow问题中了解更多信息:linq:何时使用带有筛选条件的singleOrDefault与firstOrDefault()。


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

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

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

1
2
3
4
5
                   >1 result     0 results
First()            return 1st    throw
FirstOrDefault()   return 1st    return null
Single()           throw         throw
SingleOrDefault()  throw         return null


当您使用==时,您已经在执行精确的搜索结果。表达式

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

转换为

1
WHERE UserName = [Username]

在数据库端。这一点不能与以下陈述相混淆

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

这将转化为

1
WHERE UserName like '%[Username]%'

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

也就是说,first或default将为您提供与您提供的用户名完全匹配的名字。因此,您的示例将第一个用户与名称"mruser"匹配。