0

我有一个简单的 SQL 查询,我试图将它与 Fluent API 和 Entity Framework 一起使用,但我对它进行了粗略的处理。这是查询:

 SELECT     
  tbl1.Column,      
  tbl2.Column,  
  tbl3.Column,
  tbl4.Column
 FROM dbo.Table1 tbl1  
 INNER JOIN dbo.Table2 tbl2 ON tbl1.[Table 2 ID FK] = tbl2.ID
 LEFT JOIN dbo.Table3 tbl3  ON tbl3.[NonKeyColumn] = tbl2.[NonKeyColumn]
 LEFT JOIN dbo.Table4 tbl4 ON tbl4.[Table1FK] = tbl1.ID

我的问题是 Table2 和 Table3 的连接;这些列不是任一表的主键,并且在两个表中的命名完全不同。我的表之间的关系是这样的:

表 1 << M:1 > 表 2

表 3 << M:1 > 表 2

表 4 << M:M >> 表 2

如何在 Table2 上编写将在两个给定列上加入 Table3 的关系?

我认为这是朝着正确方向迈出的一步(在表 1 中定义):

 this.HasMany(e => e.Table2)
     .WithOptional(e => e.Table1)
     .HasForeignKey(tlb2 => tbl2.Column)

但是我遇到了死胡同,因为我无法将 Table1 中的列与 Table2 中的列相关联。谢谢!

4

2 回答 2

1

你不能写这样的关系。这需要NonKeyColumn是唯一键,Table2但 EF 还不支持唯一键 => EF 不支持基于非主键的关系。

于 2013-03-06T11:22:42.033 回答
0

正如 Ladislav 指出的那样,您无法建立基于非键列的关系,但这种情况在 EF 中不一定不可能完成......它只是非常混乱。为了实现我想要仅使用 LINQ 和 EF 执行的操作,查询最终基本上具有与此类似的结构:

 var values = context.Table1.Select()
                        .GroupJoin(
                                    context.Table2.Select(),
                                    detail => detail.ID,
                                    entry => entry.ID,
                                    (detail, entry) =>
                                        new { //select columns })
                                     .DefaultIfEmpty()
                                     .GroupJoin(
                                            context.Table3.Select(),
                                            entry => entry.Id,
                                            check => check.NonKeyColumn,
                                            (entry, check) => new {//select additional columns})
                                     .DefaultIfEmpty()
                                     .GroupJoin(
                                            context.Table4.Select(),
                                            entry => entry.ID,
                                            transactions => transactions.ID,
                                            (entry, transactions) => new {//select additional columns})
                                     .DefaultIfEmpty();

使用 GroupJoins,我能够获得我需要的 LEFT JOIN 行为(.Join 执行 INNER JOIN)并得到我期望的数据集。话虽如此,我最终放弃了这种方法,只是提出了一个观点,将我的呼吁减少为:

  context.ViewTable.Select...

这只是向您表明,仅仅因为您可以做某事并不一定意味着您应该这样做。;]

于 2013-03-08T14:33:06.023 回答