我有一个用户表:

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中的主键,但这导致以下错误:

最佳答案

试试看,

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

使用由SingleOrDefault插入的Single。如果用户不存在,则Single将引发错误。如果找不到用户,则SingleOrDefault将返回null,否则将返回User对象。

SingleOrDefaultFirstOrDefault之间选择

您可以通过使用SingleOrDefaultFirstOrDefault获得用户对象,但是在选择使用哪种方法时,请考虑以下几点。
  • 如果存在,则两者都仅从集合/数据库中返回一个值,否则为默认值。
  • 但是,如果您有多个同名用户,并且您希望在执行LINQ查询时遇到异常,请使用SingleOrDefault,因为如果有多个元素可用,它将引发异常。
  • 如果您不希望发生异常和/或不想检查集合/数据库中是否存在重复数据,则只想从集合/数据库中获取第一个值,然后使用FirstOrDefaultSingleOrDefault进行比较即可获得更好的性能

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

  • 其他一些说明
  • 如果username是主键,那么我认为SingleOrDefaultFirstOrDefault性能之间没有(显着)差异,因为主键具有索引,并且在索引列上的搜索将始终快于普通列。
  • SingleSingleOrDefault将生成常规的TSQL,例如“SELECT ...”。
  • FirstFirstOrDefault方法将生成TSQL语句,例如“SELECT TOP 1 ...”
  • 关于asp.net-mvc - 使用不带主键的查找在dbSet中查找记录,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12545565/

    10-14 17:19
    查看更多