2012-09-22 57 views
15

使用查找dbSet记录我有一个用户表:查找无主键

Users: 
+ID 
+Username 
+... 

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

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

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

我也试图定义的用户名在我的EDMX一个主键,但是,导致以下错误:

Properties referred by the Principal Role User must be exactly identical to the key of the EntityType CamelotShiftManagementModel.User referred to by the Principal Role in the relationship constraint for Relationship CamelotShiftManagementModel.AssociationUserFK1. Make sure all the key properties are specified in the Principal Role. C:\Code\CamelotShiftManagement\CamelotShiftManagement\Models\CamelotDB.edmx 278 11 CamelotShiftManagement

回答

35

试用,

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

使用SingleOrDefault insted Single。如果用户不存在,则Single将引发错误。而SingleOrDefault将返回null如果用户未找到其他User对象将返回。

选择之SingleOrDefaultFirstOrDefault

您可以通过使用SingleOrDefaultFirstOrDefault但在选择哪种方法获取用户对象使用以下考虑点。

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

FirstOrDefault

  • 通常FirstOrDefault或者当我们需要单个值(第一)从集合或数据库使用First
  • 在Fist/FirstOrDefault的情况下,从数据库中只检索到一行,因此它比单/ SingleOrDefault执行得稍好。这样的小差异几乎不可察觉,但是当表格包含大量列和行时,此时性能是显而易见的。

其他一些言论

  • 如果username是主键,那么我认为不会有多少/ SingleOrDefaultFirstOrDefault性能作为主键之间没有差异,指数和指数列搜索将始终比普通列快。
  • SingleSingleOrDefault将生成一个像“SELECT ...”一样的常规TSQL。
  • FirstFirstOrDefault方法会产生这样的TSQL statment“SELECT TOP 1 ...”
+0

更好! .. 谢谢。 – Mortalus

+0

改用'FirstOrDefault'会不会更好?我对SingleOrDefault方法的理解是,它将浏览* whole *表以确保只有一条记录与条件匹配。这可能不是OP想要的。 – Crono

+1

@Crono是的,如果我们考虑它与SingleOrDefault相比的性能,那么你是正确的FirstOrDefault。但在这里,我认为取决于预期的结果,我们应该在这两种方法之间进行选择。如果你只想要单个结果,并且如果有多个序列相同,那么你需要一个异常,然后使用SinleOrDefault,否则使用FirstOrDefault。我会用这个上下文更新我的答案。 –

3

我发现它:

User myUser = myDBContext.Users.Single(user => user.Username == i_Username); 
+0

是的,它是好的,但你应该接受它作为回答,因为它是你的问题的解决方案。 –

+0

好吧,它告诉我,我只能在两天内接受它,所以我会等.. tnx – Mortalus

+0

@Mortalus找到我的答案,如果它有助于你的问题。我只是将Single更改为SingleOrDefault。 –