实体框架包括扩展返回大量数据

2024-01-08

我有两个实体:User 和 UserPermission。 User 实体包含所有常规字段,Id、Username、Email 等,UserPermission 实体有两个值:UserId 和 PermissionId。我编写了一个存储库方法 GetUserWithPermissions ,该方法最初使用 Include 扩展并执行如下操作:

return dbContext.Users.Include(u => u.UserPermission).Where(u => u.Username.Equals(username)).FirstOrDefault();

它工作得很好,但问题是,将会有一堆与任何给定用户关联的 UserPermission 实体,并且使用 Include 扩展本质上只是将两个表合并为一个表,因此对于与关联的每个 UserPermission 都会重复所有用户字段一个用户。返回的数据看起来像这样:

Id      Username      Email      ...      PermissionId
1       johndoe       [email protected] /cdn-cgi/l/email-protection      1
1       johndoe       [email protected] /cdn-cgi/l/email-protection      2
1       johndoe       [email protected] /cdn-cgi/l/email-protection      3
1       johndoe       [email protected] /cdn-cgi/l/email-protection      4
1       johndoe       [email protected] /cdn-cgi/l/email-protection      5
1       johndoe       jo[email protected] /cdn-cgi/l/email-protection      6
1       johndoe       [email protected] /cdn-cgi/l/email-protection      7

每行之间的唯一区别是最后一列 PermissionId。如果我们为用户定义了 50 个权限,那么当我认为没有必要时,就会返回大量重复数据。显然我的另一个选择是做这样的事情:

User user = dbContext.Users.Where(u => u.Username.Equals(username)).FirstOrDefault();
if (user != null)
    user.UserPermissions.ToList();
return user;

上面的代码完成了同样的事情,返回的数据大大减少,但需要对数据库进行两次访问。

哪种方法更好?返回大量重复数据或两次访问数据库?

这是实体框架生成的 SQL 查询

SELECT 
[Project2].[Id] AS [Id], 
[Project2].[Username] AS [Username], 
[Project2].[LoweredUsername] AS [LoweredUsername], 
[Project2].[CompanyId] AS [CompanyId], 
[Project2].[FirstName] AS [FirstName], 
[Project2].[LastName] AS [LastName], 
[Project2].[Email] AS [Email], 
[Project2].[C1] AS [C1], 
[Project2].[UserId] AS [UserId], 
[Project2].[PermissionValue] AS [PermissionValue]
FROM ( SELECT 
    [Limit1].[Id] AS [Id], 
    [Limit1].[Username] AS [Username], 
    [Limit1].[LoweredUsername] AS [LoweredUsername],    
    [Limit1].[CompanyId] AS [CompanyId], 
    [Limit1].[FirstName] AS [FirstName], 
    [Limit1].[LastName] AS [LastName], 
    [Limit1].[Email] AS [Email], 
    [Extent2].[UserId] AS [UserId], 
    [Extent2].[PermissionValue] AS [PermissionValue], 
    CASE WHEN ([Extent2].[PermissionValue] IS NULL) THEN CAST(NULL AS int) ELSE 1 END AS [C1]
    FROM   (SELECT TOP (1) 
        [Extent1].[Id] AS [Id], 
        [Extent1].[Username] AS [Username], 
        [Extent1].[LoweredUsername] AS [LoweredUsername],       
        [Extent1].[CompanyId] AS [CompanyId], 
        [Extent1].[FirstName] AS [FirstName], 
        [Extent1].[LastName] AS [LastName], 
        [Extent1].[Email] AS [Email]
        FROM [dbo].[Users] AS [Extent1]
        WHERE [Extent1].[LoweredUsername] = (LOWER(LTRIM(RTRIM(@p__linq__0)))) ) AS [Limit1]
    LEFT OUTER JOIN [dbo].[UserPermissions] AS [Extent2] ON [Limit1].[Id] = [Extent2].[UserId]
)  AS [Project2]
ORDER BY [Project2].[Id] ASC, [Project2].[C1] ASC

Thanks

Nick


这就是它的运作方式。Include集合确实会导致父实体的列重复(请参阅此处以获得很好的示例和解释:我可以在 EntityFramework 中的 ObjectSet 上使用多少个 Include 以保持性能? https://stackoverflow.com/questions/5521749/how-many-include-i-can-use-on-objectset-in-entityframework-to-retain-performance/5522195#5522195)

您需要进行权衡,但没有一般规则哪种方式更好:一次往返Include但有重复数据或两次往返没有重复数据。什么更好/性能更好?我认为如果你想要一个准确的答案,你必须具体情况具体分析。

我可以想象,根据经验,我们可以说:如果父母有many列和子集合只有一个few并且子集合可能非常长,那么最好选择两次往返以避免数据重复。

如果你不想急切加载Include您可以依赖延迟加载,也可以使用显式加载:

User user = dbContext.Users.Where(u => u.Username.Equals(username))
    .FirstOrDefault();
if (user != null)
    dbContext.Entry(user).Collection(u => u.UserPermissions).Load();
return user;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实体框架包括扩展返回大量数据 的相关文章

  • 在实体框架中定义两个外键作为主键

    在实体框架中 我想使用两个外键作为另一种实体类型的主键 public class CustomerExtensionValue Values for extended attributes of a customer Key Column
  • 如何使用SQL Server CE的动态连接字符串?

    我在 Windows 应用程序中使用 SQL Server CE 4 0 并使用实体框架创建它的模型 它工作正常 但我的问题是它没有构造函数来更改连接字符串 并且默认情况下它从app config file using var Contex
  • 在方法中使用 IncludeMultiple

    我正在使用 Ladislav Mrnka 的扩展方法 public static IQueryable
  • 使用 Moq 模拟实体框架 6 ObjectResult

    如何使用 Moq 模拟 Entity Framework 6 ObjectResult 以便对依赖 EF 数据库连接的代码进行单元测试 沿着这些思路阅读了大量的问题和答案 并从我所读到的内容中收集了许多有价值的信息 我已经实现了我认为相当优
  • 使用 EntityFramework 使用空参数值调用存储过程

    我在 sqlserver 2008 上有一个存储过程 其中一个参数接受空值 我不知道如何使用参数上的空值来调用该 SP 为了获得更多上下文 我正在使用 EntityFramework 6xx 在下一个示例中 参数 status Compat
  • 使用 Azure 表存储进行代码优先和身份验证

    我正在开发一个小型网络应用程序 并且刚刚达到开发阶段 我需要开始做出数据库决策 我最初的计划是在 Azure 上使用 EF Code First 和 MSSQL 因为它只是简化了使用数据库的过程 然而 当我研究 Azure 上的数据库托管功
  • 如何包装实体框架以在执行前拦截 LINQ 表达式?

    我想在执行之前重写 LINQ 表达式的某些部分 我在将重写器注入正确的位置时遇到问题 实际上根本没有 查看实体框架源代码 在反射器中 它最终归结为IQueryProvider Execute在 EF 中 它通过以下方式耦合到表达式Objec
  • 无法加载文件或程序集“EntityFramework,版本=6.0.0.0”

    我究竟做错了什么 我该如何解决这个问题 我有一个包含多个项目的解决方案 它是一个 MVC NET 4 5 Web 应用程序 在调试模式下启动后调用其中一个项目时 出现此错误 导致此错误的项目具有以下参考 两个都是版本6 0 0 0 应用程序
  • 使用 UnitofWork 模式的 Rhino 模拟实体框架不起作用

    这是我第一次尝试这样的事情 所以希望这很简单 我创建了一个使用实体框架访问数据库的 WCF 服务 我已经实施了一个工作单元接口 以便我的服务可以使用 EF 同时仍然可测试 这是我的服务 public class ProjectService
  • 升级到 Visual Studio 16.3.0 后,dotnet ef 命令不再起作用

    这种情况首先发生在家里 所以我想这可能是我家里的台式电脑的问题 但现在我回到工作岗位 我尝试升级并得到了同样的结果 升级前截图 升级 Visual Studio 后的屏幕截图 我得到的错误是 无法执行 因为找不到指定的命令或文件 造成这种情
  • AspNetUserLogins 表身份

    AspNetUserLogins 的用途是什么 是存储用户的登录信息吗 然后我如何用该数据更新该表 AspNetUserLogins 的用途是什么 在Asp net Identity中 Identity系统使用AspNetUserLogin
  • MVC3 和实体框架

    我的问题很简单 将 edmxMVC3 项目的 Web 应用程序的模型文件夹中的文件吗 我的答案非常简单 不要用数据访问逻辑和数据建模搞乱表示层 整个 MVC 应用程序 Visual Studio 解决方案中从下到上至少有 4 个项目 1 P
  • 获取给定EntityType的导航属性

    我在用VS2010 EF4 0 需要如下功能 private string GetNaviProps Type entityType eg typeof Employee NorthwindEntities en new Northwind
  • 从数据库加载而不使用代理类?

    在 Entity Framework 4 中 是否可以选择将一些查询加载到 POCO 中而不使用代理类 为了缓存该对象以供将来只读使用 我正在使用存储库 服务模式 我的意思是 var order orderService GetById 1
  • 实体框架 - 循环更新属性

    我正在尝试找到一种方法来循环 EF 对象的属性并更新这些属性的值 更具体地说 我有 50 个字段 其中最多填充 50 个下拉列表 所有 50 个可能都需要填充 也可能不需要填充 为了解决这个问题 我有一个中继器 最多可以创建 50 个 DD
  • EF数据库首先如何针对数据库更改更新模型?

    在班级图书馆Ado net Entity Data Model已生成 POCO 类 这些是第一次生成的 但数据库更改并未得到反映 在edmx图表右键单击并选择Update Model from Database显示新创建的表 但即使选择添加
  • 如何将字符串解析为 UNIQUEIDENTIFIER?

    我正在编写一个实体框架 LINQ 查询 其中我想将字符串解析为 UNIQUEIDENTIFIER 又名 GUID 作为WHERE clause public IEnumerable
  • 如果我以后要应用ado实体框架,推荐的数据访问层设计模式是什么?

    我正在创建一个网站并使用 Linq to SQl 作为数据访问层 并且我愿意使该网站可以在 linq to sql 和 ado 实体框架上工作 而无需更改其他层中的许多内容 业务逻辑层或 UI层 实现这一目标的推荐模式是什么 你能简单解释一
  • 包含目录中的所有文件?

    如何实现以下代码想要实现的目标 include dir In Bash HEADER all headers h echo ifndef ALL HEADERS gt HEADER echo define ALL HEADERS gt gt
  • 每个数据库多个/单个 *.edmx 文件

    我有一个通过 ADO net 数据服务与数据库交互的项目 数据库很大 近 150 个具有依赖关系的表 该项目几年前开始 当时使用的是数据集 现在我们正在转向实体模型关系 由于我们添加了更多需要使用的表 该模型正在不断增长 这是管理这一切的正

随机推荐

  • Android Kotlin:错误未解决参考:DaggerAppComponent

    我今天已使用 Dagger 2 将 Kotlin 插件安装到现有项目中 在安装 Kotlin 之前 我对 Dagger 没有任何问题 然而 现在编译器抱怨 Error 5 32 Unresolved reference DaggerAppC
  • 我可以传递 Web 方法参数(例如查询字符串)吗?

    这里我使用网络方法 InsertData 我可以传递查询等参数吗string json aspx InsertData username name 而不是传递为data 如果我使用类似的查询字符串有什么好处吗 ajax type POST
  • Java 将字符串数组映射为整数数组

    我在 SO 上找到了这段代码 用于将字符串映射到整数 Arrays stream myarray mapToInt Integer parseInt toArray 但如何让它映射到 Integer 类型而不是原始 int 呢 我尝试从In
  • 在 Android 中保存长文本的最佳实践

    我想知道将字符串值存储在strings xml文件 即使字符串非常大 更具体地说 我有一个游戏 我在其中显示游戏规则 所有字符的总和大于 700 个字符 目前 我将这些长字符串分解为较小的字符串 分成段落 所以我想知道 拥有那些包含超过 7
  • Phonegap/Cordova 地理定位在 Android 上不起作用

    我在两个模拟器中的 Android 上运行地理定位时遇到了麻烦 即使我geo fix通过 telnet 和设备上 适用于 iOS WP8 和浏览器 当我使用以下代码向设备询问位置时 我总是收到错误 在我的情况下是自定义的 Retrievin
  • 如何捕获 ExoPlayer 的所有错误?

    我实现了 ExoPlayer 作为我的应用程序的播放器 但我不知道如何捕获所有 ExoPlayer 错误以避免应用程序崩溃 我添加了以下侦听器 但它没有捕获所有错误 我必须使用 DRM 它有时会因某些问题而崩溃 但我之前无法设置侦听器 因为
  • C# - 删除仅提供 Control 为 ToolTip 的 ToolTip

    是的 这个问题已经被问过here https stackoverflow com questions 1165540 how do i remove a tooltip currently bound to a control at SO
  • Smack 4.1 回复超时内无响应

    我在我的 Android 应用程序中使用以下代码 Thread d new Thread new Runnable Override public void run SmackConfiguration setDefaultPacketRe
  • Mongoid - 通过引用文档查询

    我有一个名为 Ad 的模型 如下所示 class Ad include Mongoid Document referenced in category end 和类别模型 class Category include Mongoid Doc
  • Sklearn Transformers:如何将编码器应用于多个列并在生产中重用它?

    我在训练期间使用标签编码器 并希望通过保存并稍后加载来在生产中使用相同的编码器 无论我在网上找到什么解决方案 都只允许标签编码器一次应用于单个列 如下所示 for col in col list df col df col apply La
  • 我应该使用 Path.GetRandomFileName 还是使用 Guid?

    我需要生成唯一的文件夹名称 我应该使用路径 GetRandomFileName http msdn microsoft com en us library system io path getrandomfilename 28v vs 11
  • 当我们使用 antd 表中的 rowSelection 选择父行时选择子行

    我正在尝试使用 antd 表进行 rowselection Reactjs 我正在尝试这个ant components table demo expand children https ant design components table
  • 在R中添加一列两个坐标的距离

    我有一个这样的数据框 id value lat1 lng 1 lat2 lng2 dist 124 50 4 13 2423 46 2342 13 2423 46 2342 537 34 2 13 2434 46 2331 13 2423
  • 如何组合两个不同的 monad

    我正在测试 REST 服务器 我在 IO monad 中击中它并在中模拟它State Db where Db跟踪服务器的假定状态 以下函数应该运行两个版本并比较结果 check Eq a MonadState d s gt s a gt I
  • “折叠”LINQ 扩展方法在哪里?

    我发现在MSDN 的 Linq 示例 http msdn microsoft com en us vcsharp aa336747 aspx foldSimple我想使用一个名为 Fold 的简洁方法 他们的例子 double double
  • Pandas Wide_to_long 的行为与 Python 2.7 中的先前版本有很大不同

    我升级了笔记本电脑并安装了 Python 2 7 和 Pandas 0 23 由于 Wide to long 的结果不同 我以前工作的所有脚本都不再运行 数据框如下所示 Index ID Text column abc A abc B ab
  • Python——如何查看不适合屏幕的输出?

    我应该说我正在寻找问题的解决方案查看不适合您屏幕的输出 例如 range 100 将显示高度为 30 的终端中的最后 30 行 我只是希望被推向正确的方向 并且很好奇你们是如何解决这个问题的 当您遇到希望可以方便地滚动浏览一些大输出的情况时
  • 更改 teechart 中的单点颜色

    我在java中使用teechart 我想改变一系列点的颜色 而不是所有点 如果点的值超过特定值 则将点变成红色 我只知道如何更改所有点的颜色 这是我的代码 xline getPointer setVisible true 数据点突出显示 x
  • 与 mdf 文件的多个连接

    我正在为一个大学项目创建一个使用 C 的 Net 应用程序 并且需要一些帮助 我在网络驱动器上托管了一个 mdf 文件 并且需要多个客户端才能从其应用程序访问此数据库 每个客户端计算机都将运行自己的 sql express 实例 我可以从我
  • 实体框架包括扩展返回大量数据

    我有两个实体 User 和 UserPermission User 实体包含所有常规字段 Id Username Email 等 UserPermission 实体有两个值 UserId 和 PermissionId 我编写了一个存储库方法