2013-03-05 61 views
0

我有一個微不足道的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 < < L:M >>表2

如何我可以在Table2上編寫一個關於兩個給定列加入Table3的關係嗎?

我認爲這是朝着正確方向邁出的一步(表1上定義):

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

但我打了一個死衚衕,因爲我不能在表1列到表2中的列關聯。謝謝!

+0

你已經有實體嗎? – NunoCarmo 2013-03-05 22:10:20

+0

是的。它可能會提到我使用的是代碼優先的方法,所以沒有EDMX來設置協會或這種性質的東西。 – dparsons 2013-03-06 02:00:54

+0

我認爲如果你可以在這裏發佈真實的實體,以便我們可以看到實際的場景,那將會很好。 – 2013-03-06 03:38:38

回答

1

你不能寫這樣的關係。這需要NonKeyColumnTable2中的唯一鍵,但EF不支持唯一鍵,但=> EF不支持基於非主鍵的關係。

0

正如拉迪斯拉夫指出的,你不能建立一個基於非關鍵列的關係,但這種情況在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的行爲,我需要(做。加入一個INNER JOIN)並獲得了我期望的數據集。話雖這麼說,我最終被放棄這種做法,只是站起身來降低我的電話,只是一個觀點:

context.ViewTable.Select... 

這只是表明你,只因爲你可以做一些事情並不意味着你應該。 ;]