31

我有一个用户表:

Users:
 +ID
 +Username
 +...

我想用myDBContext.Users.Find(Username)find一个用户。在我目前的情况下,我不能使用他的 ID。

我必须使用完整的 LINQ 查询吗?例如

var user = from users in myDBContext.Users.Find(Username) 
           where users.Username == username
           select users

我还尝试将用户名定义为我的 edmx 中的主键,但这导致了以下错误:

主体角色用户引用的属性必须与关系 CamelotShiftManagementModel.AssociationUserFK1 的关系约束中主体角色引用的 EntityType CamelotShiftManagementModel.User 的键完全相同。确保在 Principal Role 中指定了所有关键属性。C:\Code\CamelotShiftManagement\CamelotShiftManagement\Models\CamelotDB.edmx 278 11 CamelotShiftManagement

4

2 回答 2

60

尝试,

User myUser = myDBContext.Users.SingleOrDefault(user => user.Username == username);

使用SingleOrDefaultinsted 的Single。如果用户不存在,Single则会抛出错误。如果未找到用户,SingleOrDefault则将返回null,否则User将返回对象。

SingleOrDefault在和之间选择FirstOrDefault

您可以使用SingleOrDefaultand获取用户对象,FirstOrDefault但在选择要使用的方法时请考虑以下几点。

  • 如果存在,则两者都只从集合/数据库返回一个值,否则返回默认值。
  • 但是,如果您有多个同名用户,并且您希望在执行 LINQ 查询时遇到异常,那么请使用SingleOrDefault,因为如果有多个可用元素,它将引发异常。
  • 如果您不想要异常和/或您不想检查您的集合/数据库是否有重复数据,只想从集合/数据库中获取第一个值,然后使用FirstOrDefault以获得更好的性能比较SingleOrDefault

FirstOrDefault

  • 通常FirstOrDefaultFirst在我们需要集合或数据库中的单个值(第一个)时使用。
  • 在 First / FirstOrDefault 的情况下,仅从数据库中检索一行,因此它的性能略好于 single / SingleOrDefault。如此小的差异几乎不会引起注意,但是当表包含大量列和行时,此时性能是显而易见的。

其他一些备注

  • 如果是主键,那么我认为和性能username之间不会有(显着)差异,因为主键具有索引并且对索引列的搜索总是比普通列快。SingleOrDefaultFirstOrDefault
  • Single或者SingleOrDefault会生成一个像“SELECT ...”这样的常规 TSQL。
  • Firstor方法将FirstOrDefault生成 TSQL 语句,如“SELECT TOP 1...”
于 2012-09-23T05:06:21.510 回答
5

我找到了它:

User myUser = myDBContext.Users.Single(user => user.Username == i_Username);
于 2012-09-22T16:37:39.360 回答