2013-03-15 65 views
0

下面的LINQ查詢(personDevices)沒有任何問題。但是,當我通過外鍵直接訪問值「123」替換:LINQ外鍵破解查詢

t3.deviceTypeA.mobile_number 

...查詢返回0結果。最後,我想要做一個select語句如下所示:

number = 
t3.type == "phone" ? t3.deviceTypeA.mobile_number: 
t3.type == "computer" ? t3.deviceTypeB.computer_number : 
t3.type == "legacy" ? t3.deviceTypeC.legacy_number : 
"nodata" 

這就解釋了爲什麼我需要的外鍵,但我已經簡化了問題的查詢。

var personDevices = from t1 in db.people 
join t2 in db.peopleDevices on t1.person_id equals t2.person_id 
join t3 in db.deviceRegistrations on t2.registration_id equals t3.registration_id 

select new { 
    t1.person_id, 
    t1.name, 
    t3.type, 
    t3.generated_code, 
    t3.hardware_id, 
    devicetypeA_number = "123" 
}; 

由於各種原因,我禁用了對外鍵的引用完整性並刪除了數據檢查。使用SQL Server 2008和運行在C#.NET查詢4.

爲什麼訪問外鍵表中的數據導致查詢返回任何結果,以及如何解決這個問題?

+0

啓動「VAR personDevices」的片段完全工作,但是當我取代「123」,「t3.deviceTypeA.mobile_number」它不返回任何結果。我剛纔提到,我打算做的事情是讓代碼段開始「number =」替換行「devicetypeA_number = 123」,以使我需要使用外鍵的理由清除 – Shane 2013-03-18 08:46:36

+0

我不得不懷疑你是否實際上得到了一個異常,其中t3.deviceTypeA爲空,並在代碼中的其他地方吞食該異常。我總是建議開啓所有例外的突破來捕捉這類事物。我已經看到你已經解決了這個問題,但是我認爲我會把它扔到那裏,以防其他人遇到類似的問題。 – 2013-04-04 14:55:21

回答

0

我永遠無法解決這個問題。相反,我更改了數據庫結構,以便可以通過device_type字段在一個表中引用所有3種設備類型,並通過爲兩種不同類型的引用號重複使用列。

是的,設計沒有完全標準化,但要簡單得多。

我也結束了使用嵌入式查詢,因爲我是傾向於從LINQ得到不符合我的期望,由於時間的限制只是放棄了,並採取了簡單的選項,而不是搞亂的結果。