使用不带主键的查找在dbSet中查找记录

时间:2012-09-22 16:23:38

标签: asp.net-mvc linq entity-framework

我有一个用户表:

Users:
 +ID
 +Username
 +...

我想使用myDBContext.Users.Find(Username)来结束用户。 在我目前的情况下,我不能使用他的身份证。

我必须使用完整的LINQ查询吗? e.g。

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

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

  

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

2 个答案:

答案 0 :(得分:48)

试试,

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

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

SingleOrDefaultFirstOrDefault之间的选择

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

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

<强> FirstOrDefault

  • 当我们从集合或数据库中需要单值(第一个)时,通常使用FirstOrDefaultFirst
  • 对于Fist / FirstOrDefault,只从数据库中检索到一行,因此它的性能略好于single / SingleOrDefault。如此小的差异几乎不可察觉,但当表格包含大量的列和行时,此时表现显而易见。

其他一些评论

  • 如果username是主键,那么我认为SingleOrDefaultFirstOrDefault性能之间没有太大/没有区别,因为主键具有索引并且索引列上的搜索将始终更快比普通的专栏。
  • SingleSingleOrDefault会生成常规TSQL,例如“SELECT ...”。
  • FirstFirstOrDefault方法将生成TSQL语句,例如“SELECT TOP 1 ...”

答案 1 :(得分:4)

我找到了它:

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