我的数据库中有两个表: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
}
优点:快速,简单,不需要我改变我的模型。
缺点:似乎有点hacky。在项目的其他任何地方,我们只是使用标准的实体框架代码,因此这偏离了规范。此外,它与第一个选项具有相同的问题;仍然没有TPM_AREAWORKGROUPS
类。
问题:此问题的最佳解决方案是什么?
理想情况下,我想做#2但是我不太确定如何调整我的模型。或者,也许有人知道比我的三种选择更好的方法。
答案 0 :(得分:3)
你可以这样做:
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),因为您必须更改模型,并且有一种简单有效的方法可以不更改它。
< / LI>答案 1 :(得分:0)
如何使用投影加载数据?
你可以这样做填充一个匿名对象,然后按你喜欢的方式使用它。