比方說,我有一個Order
表,它有一個FirstSalesPersonId
字段和一個SecondSalesPersonId
字段。這兩個都是引用SalesPerson
表的外鍵。對於任何給定的訂單,可以將一個或兩個銷售人員記入訂單。換句話說,FirstSalesPersonId
永遠不可能是NULL
,但SecondSalesPersonId
可以是是NULL
。我可以強制自動生成的Linq-to-SQL類使用OUTER JOIN嗎?
當我將我的Order
和SalesPerson
表到「LINQ to SQL類」設計圖面,該類建設者斑點從Order
表兩個FK關係到SalesPerson
表,並因此產生Order
類有一個SalesPerson
場和一個SalesPerson1
字段(爲了避免混淆,我可以將其重命名爲SalesPerson1
和SalesPerson2
)。
因爲我總是希望有營業員可用數據,每當我處理訂單,我使用DataLoadOptions.LoadWith
指定兩個營業員字段填充填充了單實例時,如下所示:
dataLoadOptions.LoadWith<Order>(o => o.SalesPerson1);
dataLoadOptions.LoadWith<Order>(o => o.SalesPerson2);
我遇到的問題是,LINQ到SQL是使用類似下面的SQL來加載順序:
SELECT ...
FROM Order O
INNER JOIN SalesPerson SP1 ON SP1.salesPersonId = O.firstSalesPersonId
INNER JOIN SalesPerson SP2 ON SP2.salesPersonId = O.secondSalesPersonId
這將使意義,如果總有兩個銷售人員記錄,但由於有時沒有第二個銷售人員(secondSalesPersonId
爲NULL
),因此INNER JOIN
會導致查詢在該情況下不返回任何記錄。
我在這裏有效地想要將第二個INNER JOIN
更改爲LEFT OUTER JOIN
。有沒有辦法通過用於類生成器的用戶界面來執行此操作?如果不是,我還能如何實現這一目標? (請注意,因爲我幾乎全部使用生成的類,所以如果我可以避免的話,我寧願沒有在這一種情況下加上一些東西)。
編輯:按我的評論回覆中,SecondSalesPersonId
場是可空(在數據庫中,並在生成的類)。
@Neil:它*爲*可空(甚至在「鏈接到SQL類」UI中顯示爲空)。 – 2010-03-14 22:12:30
@尼爾:是的,如果我不使用LoadWith,那麼它只會按需加載銷售人員數據。但是,在我的情況下,我將在一個循環中處理數百個訂單記錄,這將意味着數百次訪問數據庫以單獨獲取每個銷售人員記錄。這正是我試圖用LoadWith避免的。它與第一個銷售人員記錄一起工作;我試圖讓它與第二個一起工作。 – 2010-03-15 09:28:21
@Neil:謝謝,我非常感謝你的時間,但你已經有點離開了我想要去的地方,那就是當我實例化一個Order對象時,Order.SalesPerson1和Order.SalesPerson2字段在相同的數據庫查詢中同時填充。我不想編寫SQL來執行它(或LINQ僞SQL),我只是希望它能像「簡單」情況下那樣工作。這似乎並不合理,因爲這不是一個複雜的情況。 – 2010-03-18 11:32:07