c# – 是否有快速获得两个实体之间的关联的方法?
我的数据库中有两个表: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但是我不太确定如何调整我的模型.或者,也许有人知道比我的三种选择更好的方式. 解决方法
你可以这样做:
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)因为您必须更改模型,并且有一种简单而有效的方法可以不更改它. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |