【问题标题】:Entity Framework joining tables from two different entities实体框架连接来自两个不同实体的表
【发布时间】:2019-12-27 07:32:43
【问题描述】:

我正在处理一个包含超过 15 个数据库的项目,我总是需要连接来自不同实体的表,所以我最终使用 .ToList。

朋友建议我做一个数据库链接服务器,然后在同一个数据库中为所有引用表创建视图。

但我对他们俩都不满意。

除了.ToList 和数据库视图之外还有其他解决方案吗?在这种情况下,最佳做法是什么?

【问题讨论】:

  • 您是否需要完全在内存中的查询结果?比 ToList 是正确的事情,这没有什么不好。您可以使用 Foreach 作为替代项逐项迭代 - 如果您不需要同时进行所有操作。 “不开心”并不能真正解释您的偏好。
  • ToList 将获取我不想要的整个查询。例如,如果你想连接两个表并给其中一个 .tolist 它获取所有记录然后它使用连接过滤这是不正确的,这就是我问的原因
  • 如果您不想获取它们,请不要使用 ToList !这是您在查询中做的最后一件事。您必须要获取某些内容,否则您将不需要查询!如果你获取太多,你附加 where-conditions 并说出你想要哪个......如果你查询你不想查询的东西,你的查询是错误的,这与 ToList() 无关。 ToList 的意思类似于“立即执行查询”。
  • 好的!你读过我的问题吗?当我有两个不同的实体时,我正在寻求解决方案
  • 是的,但是您的问题中没有代码,并且“拥有实体”和获取是一回事。内存中的实体是在获取时建立的。您应该让 SQL 服务器执行跨数据库连接。您是否在不同的 DbContext 上运行不同的查询并尝试将它们加入内存?你不需要 ToList (只是省略它),但它会从两个服务器加载两个表。你怎么能在不加载两个源表的情况下进行连接?根据定义,这是不可能的。您可以使用 ToDictionary 加速它,或者使用分组查询查询一个表。

标签: c# database vb.net entity-framework


【解决方案1】:

有很多方法可以解决这个问题,每种方法都有自己的缺点。

带有视图的链接数据库

查看usage on the Microsoft docs

从 SQL Server 外部访问数据的能力。

能够针对整个企业的异构数据源发布分布式查询、更新、命令和事务。

以类似方式处理不同数据源的能力。

第三点正是你的情况。如果需要,您还可以链接多个数据库,如 mysql。

虽然有很多缺点 (check here)。我会添加一个我自己的并说

用代码和自动映射器实现

如果所有表格都相似,那么您可以使用 automapper 之类的工具从数据中轻松制作列表

  1. 使用实体框架获取数据
  2. 使用自动映射器映射到具有公共属性的 DTO 对象
  3. 使用 Range add 合并您的列表。

重复数据

我们生活在一个 nosql 解决方案与 RDBMS 解决方案一起使用的世界中。可能是您创建了一个通用数据库(RDBMS 或 nosql 或适合您的任何东西),并在那里复制您的数据。

这是额外的工作,但它的使用速度最快。

我可以想到更多,但这就是它的要点。

【讨论】:

  • 我们公司有一个遗留系统,数据库结构很糟糕,我来晚了,所以我不得不忍受它。表非常大,所以我正在寻找一个解决方案可以运行而不获取服务器内存中的所有表对象
  • 既然你想使用ToList(),你就无法避免这种情况。编码选项表示您需要执行单个查询、自动映射然后合并。这可能真的是浪费时间。请注意,尽管链接服务器的查询速度非常慢,而且一个数据库中的死锁可能会将问题传播到另一个数据库。
  • 老实说,我使用 tolist 是因为它是实现我现在想要的最简单的方法,因为它是最佳实践
猜你喜欢
  • 2017-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-04
相关资源
最近更新 更多