2013-03-15 72 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得到不符合我的期望,由于时间的限制只是放弃了,并采取了简单的选项,而不是搞乱的结果。