我有一个简单的SQL查询,我试图使用Fluent API和实体框架,但我有一个粗略的。这是查询:
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
我的问题是表2和表3的连接;列不是任何一个表的主键,并且在两个表中命名完全不同。表格之间的关系如下:
表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中的列相关联,因此我遇到了死胡同。谢谢!
答案 0 :(得分:1)
你不能写这种关系。这需要NonKeyColumn
Table2
中的唯一键,但EF不支持唯一键=> EF不支持基于非主键的关系。
答案 1 :(得分: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...
这只会告诉你,仅仅因为你可以做某事并不一定意味着你应该这样做。 ]