3

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

谢谢。

4

1 回答 1

5

更新

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

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

例如,连接所需的从两个数据库中仅选择一小组数据的yesterday位置在哪里:DateTime

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 个可枚举来进行连接,例如分块- 这并不是微不足道的。按相同顺序对两个表中的数据进行排序会有所帮助。

原始答案

我相信您正在寻找 Linq JOIN 扩展方法

您可以加入以下任意 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}
于 2013-06-06T06:52:32.507 回答