首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有一个快速的方法来获取两个实体之间的每一个关联吗?

有一个快速的方法来获取两个实体之间的每一个关联吗?
EN

Stack Overflow用户
提问于 2013-04-26 16:55:07
回答 2查看 117关注 0票数 5

我的数据库中有两个表:TPM_AREASTPM_WORKGROUPS。这两个表之间存在着多到多的关系,这些关系存储在一个名为TPM_AREAWORKGROUPS的表中。这张桌子看起来是这样的:

我需要做的是尽快地将所有这些映射加载到内存中。由于TPM_AREAWORKGROUPS是一个协会,我不能简单地说:

代码语言:javascript
复制
var foo = (from aw in context.TPM_AREAWORKGROUPS select aw);

我可以想出三种可能的方法来做到这一点,但我不太确定如何做到每一种,也不知道哪一种是最好的。

1)在每个工作组中加载,包括关联区域:

类似于:

代码语言:javascript
复制
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()。然后我就可以做:

代码语言:javascript
复制
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类。

问题:这个问题的最佳解决方案是什么?

理想情况下,我想做第二,但我不太确定如何调整我的模型。或者,也许有人知道比我三个选择更好的方法。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-26 17:15:53

你可以这样做:

代码语言:javascript
复制
var result = context
    .TPM_WORKGROUPS
    .SelectMany(z => z.TPM_AREAS.Select(z2 => new
                    {
                        z2.AREAID,
                        z.WORKGROUPID
                    }));

翻译后的SQL将是一个简单的SELECT AREAID, WORKGROUPID FROM TPM_AREAWORKGROUPS

关于其他选择:

  • 我不会使用选项3),因为在使用实体框架时,我个人尽可能避免使用原始SQL (由于某些原因,请参阅https://stackoverflow.com/a/8880157/870604 )。
  • 我不会使用选项2),因为您必须更改您的模型,而且有一种简单有效的方法允许而不是更改它。
票数 3
EN

Stack Overflow用户

发布于 2013-04-26 17:10:51

如何使用投影加载数据?

您可以这样做,填充一个匿名对象,然后以您喜欢的方式处理它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16241521

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档