Sql server LINQ To SQL能否生成无效的SQL?
我有两个使用Linq to SQL的表。这些表具有1对多的关联。数据库模式的重要部分如下所示:Sql server LINQ To SQL能否生成无效的SQL?,sql-server,linq,linq-to-sql,expression-trees,Sql Server,Linq,Linq To Sql,Expression Trees,我有两个使用Linq to SQL的表。这些表具有1对多的关联。数据库模式的重要部分如下所示: Camera: Id (int) SerialNumber (string) ... CameraCalibration Id (int) CameraFk (int) ... 使用LINQ to SQL,我可以获得具有10个字符序列号的摄像机的所有摄像机校准列表,如下所示 var query = from n in db.CameraCalibrations wh
Camera:
Id (int)
SerialNumber (string)
...
CameraCalibration
Id (int)
CameraFk (int)
...
使用LINQ to SQL,我可以获得具有10个字符序列号的摄像机的所有摄像机校准列表,如下所示
var query = from n in db.CameraCalibrations
where n.Camera.SerialNumber.Length == 10
select n
根据我对LINQ的理解,下面的查询应该同样有效(即使通过比较,它相当残酷…)
然而,当我对数据库执行第二个查询时,我得到一个SQL异常,声明“cannotcallmethodsonnvarchar”。当我查看生成的SQL时,似乎很清楚为什么会生成异常:
SELECT t0.*
FROM CameraCalibration AS t0
WHERE (
SELECT t1.serialNumber.Length
FROM Camera AS t1
WHERE t1.id = t0.cameraFk
) = 10
注意生成的SQL如何使用表达式t1.serialNumber.Length?我本以为这会被翻译成LEN(t1.serialNumber),事实上,有了这个更改,查询就可以工作了
我做错什么了吗?或者这是我构造查询的方式中的错误和/或LINQ对SQL的限制
虽然我可以轻松地重新构造用于演示问题的查询,但在我的实际场景中,这将更加困难(部分原因是涉及动态生成的LINQ)
如何编写一个与LINQ to SQL乐于执行的第二个查询(在where子句中执行查找)类似的查询?在这个特定实例中,我认为您需要在LINQ语句中连接两个表。这将允许您在不使用
.SerialNumber.Length
关联的情况下获取SerialNumber的实例。类似这样(未经测试):
你的解决方案确实有效。另一种方法是使用db.Cameras.Where(c=>c.Id==n.CameraFk).SingleOrDefault(z=>z.SerialNumber.Length==10)!=where子句为null。我的问题是在我的真实场景中,动态生成LINQ查询的框架不容易让我重写查询以使用连接等。因此,我试图理解为什么现有结构的查询会引发SQL异常。非常奇怪-看起来你发现了一个bug。不过,使用连接几乎总是比使用子查询更好,所以我还是选择Robert Harvey的答案。
SELECT t0.*
FROM CameraCalibration AS t0
WHERE (
SELECT t1.serialNumber.Length
FROM Camera AS t1
WHERE t1.id = t0.cameraFk
) = 10
var query = from n in db.CameraCalibrations
join c in db.Cameras on c.Id equals n.CameraFk
where c.SerialNumber.Length == 10
select n;