在没有主键的情况下使用 Find 在 dbSet 中查找记录

Posted

技术标签:

【中文标题】在没有主键的情况下使用 Find 在 dbSet 中查找记录【英文标题】:Find a record in dbSet using Find without a primary key 【发布时间】:2012-09-22 16:23:38 【问题描述】:

我有一个用户表:

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

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

【问题讨论】:

【参考方案1】:

试试看,

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

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

SingleOrDefaultFirstOrDefault 之间进行选择

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

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

FirstOrDefault

当我们需要集合或数据库中的单个值(第一个)时,通常使用 FirstOrDefaultFirst。 在 First / FirstOrDefault 的情况下,只会从数据库中检索一行,因此它的性能略好于 single / SingleOrDefault。这么小的差异几乎看不出来,但是当表包含大量的列和行时,这个时候性能是很明显的。

其他一些说明

如果username 是主键,那么我认为SingleOrDefaultFirstOrDefault 的性能不会有(显着)差异,因为主键具有索引并且在索引列上的搜索总是比普通列快。李> SingleSingleOrDefault 将生成一个常规 TSQL,如“SELECT ...”。 FirstFirstOrDefault 方法将生成 TSQL 语句,如“SELECT TOP 1...”

【讨论】:

改用FirstOrDefault不是更好吗?我对SingleOrDefault 方法的理解是它会浏览整个 表以确保只有一条记录符合条件。这可能不是 OP 想要的。 @Crono 是的,如果我们将 FirstOrDefault 的性能与 SingleOrDefault 相比,那么您是正确的。但是在这里我认为根据预期结果我们应该在这两种方法之间进行选择。如果您只想要一个结果,并且如果有多个相同的序列,那么您期望出现异常,则使用 SinleOrDefault,否则使用 FirstOrDefault。我将在此上下文中更新我的答案。 @Crono 我希望以上我更新的答案将提供对SingleOrDefaultFirstOrDefault 的详细了解。【参考方案2】:

我找到了:

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

【讨论】:

是的,没关系,但您应该接受它作为答案,因为它是您问题的解决方案。 嗯,它告诉我我只能在两天内接受它,所以我会等待.. tnx @Mortalus 如果对您的问题有帮助,请找到我的答案。我刚刚将 Single 更改为 SingleOrDefault。

以上是关于在没有主键的情况下使用 Find 在 dbSet 中查找记录的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有主键的情况下从连接表中创建实体

如何在没有主键的情况下从 mySQL 中的两个表中获取不常见的记录

具有多列主键的 Laravel 模型

在DataTable和DataView中查找指定记录

我可以在没有自动 ID 的情况下在 Django 中创建模型吗?

在没有 DbSet 的情况下查询 Entity Framework Core