我的数据库中有两个表:TPM_AREAS
和TPM_WORKGROUPS
. 这两个表之间存在多对多的关系,这些关系存储在一个名为 的表中TPM_AREAWORKGROUPS
。该表如下所示:
我需要做的是以最快的方式一次将所有这些映射加载到内存中。作为TPM_AREAWORKGROUPS
一个协会,我不能只说:
var foo = (from aw in context.TPM_AREAWORKGROUPS select aw);
我可以想到三种方法来做到这一点,但是我不太确定如何完成每一种方法,也不知道哪一种是最好的。
1) 在每个工作组中加载,包括相关区域:
就像是:
var allWG = (from w in context.TPM_WORKGROUPS.Include("TPM_AREAS")
where w.TPM_AREAS.Count > 0
select w);
// Loop through this enumeration and manually build a mapping of distinct AREAID/WORKGROUPID combinations.
优点:这可能是标准的 EntityFramework 做事方式,不需要我更改任何数据库结构或映射。
缺点:可能会很慢,因为TPM_WORKGROUPS
表相当大并且TPM_AREAWORKGROUPS
表只有 13 行。另外,没有TPM_AREAWORKGROUPS
类,所以我必须返回一组元组或为此创建一个新类。
2)改变我的模型
理想情况下,我想要一个TPM_AREAWORKGROUP
班级和一个context.TPM_AREAWORKGROUP
财产。我使用设计器直接从数据库创建这个模型,所以我不太确定如何强制这个关联成为一个实际的模型。是否有捷径可寻?
优点:它可以让我直接选择这个表,用一行代码完成。耶!
缺点:迫使我改变我的模型,但这是一件坏事吗?
3) 搞砸了,使用原始 SQL 来获得我想要的东西。
我可以获取StoreConnection
上下文的属性,并CreateCommand()
直接调用。然后我可以这样做:
using (DbCommand cmd = conn.CreateCommand())
{
cmd.CommandText = "SELECT AreaId, WorkgroupId FROM TPM_AREAWORKGROUPS";
var reader = cmd.ExecuteReader();
// Loop through and get each mapping
}
优点:快速、简单,不需要我改变我的模型。
缺点:看起来有点老套。在项目的其他地方,我们只是使用标准的实体框架代码,所以这偏离了规范。此外,它与第一个选项具有相同的问题;仍然没有TPM_AREAWORKGROUPS
课。
问题:这个问题的最佳解决方案是什么?
理想情况下,我想做 #2 但是我不太确定如何调整我的模型。或者,也许有人知道比我的三个选项更好的方法。