2

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

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

按用户名选择某人。我的理解是,如果我的用户具有相似的用户名(即当我有名为“MrUserOne”、“MrUserTwo”和“MrUser”的用户时搜索“MrUser”可能会产生“MrUserOne”,我将无法使用“FirstOrDefault()”,因为这是出现的“第一个”搜索结果),如果我对“FirstOrDefault”的未来困难的理解是正确的,我应该使用什么来代替它?

还是我对 FirstOrDefault 将如何工作的理解错了?

4

4 回答 4

8

看来您不太了解==操作员在这种情况下的工作方式。假设UserNameName值都是string然后==将进行精确的序数匹配。这个名字"MrUser"根本不匹配"MrUserOne"。它只会匹配"MrUser"

话虽如此,此代码将返回Name值完全匹配o.UserNamenull不匹配的第一个用户。

于 2012-04-18T20:46:18.693 回答
5

JaredPar 的说法完全正确。但是,如果您期望的结果恰好是一个结果,您也可以使用 SingleOrDefault。您可以在这个 Stackoverflow 问题中阅读更多相关信息:LINQ: When to use SingleOrDefault vs. FirstOrDefault() with filtering criteria

于 2012-04-18T20:51:29.407 回答
3

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

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 to Entities 转换字符串函数。

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

于 2012-04-18T20:49:32.237 回答
3

您的查询将只返回第一个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
于 2012-04-18T20:52:29.343 回答