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

Mor*_*lus 27 linq asp.net-mvc entity-framework

我有一个用户表:

Users:
 +ID
 +Username
 +...
Run Code Online (Sandbox Code Playgroud)

我想用来myDBContext.Users.Find(Username)为用户提供帮助.在我目前的背景下,我不能使用他的身份证.

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

var user = from users in myDBContext.Users.Find(Username) 
           where users.Username == username
           select users
Run Code Online (Sandbox Code Playgroud)

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

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

Jig*_*ker 52

试试,

User myUser = myDBContext.Users.SingleOrDefault(user => user.Username == username);
Run Code Online (Sandbox Code Playgroud)

使用SingleOrDefaultinsted Single.如果用户不存在Single则会抛出错误.尽管SingleOrDefault将返回null如果没有找到用户,否则User对象将是回报.

选择SingleOrDefault和之间FirstOrDefault

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

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

FirstOrDefault

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

其他一些言论

  • 如果username是主键,那么我认为主键之间没有太大/没有区别SingleOrDefault,FirstOrDefault因为主键有索引,索引列上的搜索总是比普通列快.
  • SingleSingleOrDefault将生成常规TSQL,如"SELECT ...".
  • FirstFirstOrDefault方法将产生TSQL statment像"SELECT TOP 1 ..."

  • @Crono 是的,如果我们考虑与 SingleOrDefault 相比它的性能,那么您适合 FirstOrDefault。但是在这里我认为根据预期的结果我们应该在这两种方法之间进行选择。如果您只想要单个结果,并且如果有多个相同的序列,您期望出现异常,则使用 SinleOrDefault,否则使用 FirstOrDefault。我将在此上下文中更新我的答案。 (2认同)
  • @Crono 我希望我更新后的答案能提供对“SingleOrDefault”和“FirstOrDefault”的详细理解。 (2认同)

Mor*_*lus 5

我找到了:

User myUser = myDBContext.Users.Single(user => user.Username == i_Username);
Run Code Online (Sandbox Code Playgroud)