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()"。默认,"我应该在它的位置使用什么?"
或者我对第一个或第二个结果如何工作的理解是错误的?
您似乎不太了解
也就是说,如果没有,此代码将返回其
贾雷德帕说的很对。但是,如果您期望的结果正好是一个结果,那么也可以使用singleOrDefault。您可以在这个stackOverflow问题中了解更多信息:linq:何时使用带有筛选条件的singleOrDefault与firstOrDefault()。
您的查询只返回其
因此,如果有两个用户名相同,返回值将只是第一个。"第一个"可能不同,这取决于数据库返回结果时的感觉(因为您没有指定顺序)。
作为旁注,您应该熟悉这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"匹配。