如何使用linq查询从两个不同的edmx连接两个表

时间:2013-06-06 06:07:54

标签: linq entity-framework edmx

如何使用linq查询从两个不同的edmx连接两个表.. 有没有办法一次从2个不同的edmx进行查询。

感谢。

1 个答案:

答案 0 :(得分:5)

<强>更新

根据您的评论,EF无法在两个不同的上下文中解析组合的表达式树。

如果表中的记录总数相对较小,或者您可以将联接中的记录数减少到少量行(例如每个<100),那么您可以实现数据(例如.ToList() / .ToArray() / .AsEnumerable()}来自两个表,并使用Linq join,如下所示。

e.g。其中yesterdayDateTime,只选择连接所需的两个数据库中的一小组数据:

var reducedDataFromTable1 = context1.Table1
                                    .Where(data => data.DateChanged > yesterday)
                                    .ToList();
var reducedDataFromTable2 = context2.Table2
                                    .Where(data => data.DateChanged > yesterday)
                                    .ToList();
var joinedData = reducedDataFromTable1
                         .Join(reducedDataFromTable2,
                               t1 => t1.Id,    // Join Key on table 1
                               t2 => t2.T1Id,  // Join Key on table 2
                               (table1, table2) => ... // Projection
                               );

但是,如果两个数据库中连接所需的数据大于可以合理预期在内存中完成的数据,那么您需要调查替代方案,例如:

  • 您可以在数据库中进行跨数据库连接吗?如果是这样,请查看使用Sql投影(如视图)进行连接,然后可以在edmx中使用。
  • 否则,您将需要通过手动迭代2个枚举来完成连接,例如chunking - 这并非完全无关紧要。按相同的顺序对两个表中的数据进行排序将有所帮助。

原始答案

我相信您正在寻找Linq JOIN extension method

您可以加入任意2 IEnumerables,如下所示:

var joinedData = context1.Table1
                         .Join(context2.Table2,
                               t1 => t1.Id,    // Join Key on table 1
                               t2 => t2.T1Id,  // Join Key on table 2
                               (table1, table2) => ... // Projection
                               );

其中:

  • 在表1上加入密钥,例如表1的主键或常见的自然
  • 在表2中加入密钥,例如外键或常用自然键
  • 投影:您可以从table1和table2获得任何内容,例如: 进入一个新的匿名类,例如new {Name = table1.Name, Data = table2.SalesQuantity}