是否有快速的方法来获得两个实体之间的每个关联?

Mik*_*sen 5 .net c# entity-framework

我的数据库中有两个表:TPM_AREASTPM_WORKGROUPS.这两个表之间存在多对多关系,这些关系存储在一个名为的表中TPM_AREAWORKGROUPS.此表如下所示:

在此输入图像描述

我需要做的是以尽可能最快的方式立即将所有这些映射加载到内存中.作为TPM_AREAWORKGROUPS一个协会,我不能只说:

var foo = (from aw in context.TPM_AREAWORKGROUPS select aw);
Run Code Online (Sandbox Code Playgroud)

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

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.
Run Code Online (Sandbox Code Playgroud)

优点:这可能是标准的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
}
Run Code Online (Sandbox Code Playgroud)

优点:快速,简单,不需要我改变我的模型.

缺点:看起来有点hacky.在项目的其他任何地方,我们只是使用标准的实体框架代码,因此这偏离了规范.此外,它与第一个选项具有相同的问题; 还没有TPM_AREAWORKGROUPS上课.

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

理想情况下,我想做#2但是我不太确定如何调整我的模型.或者,也许有人知道比我的三种选择更好的方式.

ken*_*n2k 3

你可以这样做:

var result = context
    .TPM_WORKGROUPS
    .SelectMany(z => z.TPM_AREAS.Select(z2 => new
                    {
                        z2.AREAID,
                        z.WORKGROUPID
                    }));
Run Code Online (Sandbox Code Playgroud)

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

关于其他选项:

  • 我不会使用选项 3),因为我个人在使用实体框架时尽可能避免使用原始 SQL(出于某些原因,请参阅/sf/answers/621611021/)。

  • 我不会使用选项 2),因为您必须更改模型,并且有一种简单而有效的方法可以更改它。