我的数据库中有两个表: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类。
问题:这个问题的最佳解决方案是什么?
理想情况下,我想做第二,但我不太确定如何调整我的模型。或者,也许有人知道比我三个选择更好的方法。
发布于 2013-04-26 17:15:53
你可以这样做:
var result = context
.TPM_WORKGROUPS
.SelectMany(z => z.TPM_AREAS.Select(z2 => new
{
z2.AREAID,
z.WORKGROUPID
}));翻译后的SQL将是一个简单的SELECT AREAID, WORKGROUPID FROM TPM_AREAWORKGROUPS。
关于其他选择:
发布于 2013-04-26 17:10:51
如何使用投影加载数据?
您可以这样做,填充一个匿名对象,然后以您喜欢的方式处理它。
https://stackoverflow.com/questions/16241521
复制相似问题