gpt4 book ai didi

sql-server - LINQ To SQL可以生成无效的SQL吗?

转载 作者:行者123 更新时间:2023-12-04 16:26:03 25 4
gpt4 key购买 nike

我有两个用于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
where n.Camera.SerialNumber.Length == 10
select n


根据我对LINQ的理解,以下查询应该同样有效(即使比较起来也很残酷...)

var query = from n in db.CameraCalibrations
where db.Cameras.Where(c => c.Id == n.CameraFk).SingleOrDefault()
.SerialNumber.Length == 10
select n


但是,当我对数据库执行第二个查询时,我得到一个SQL异常,指出“无法在nvarchar上调用方法”。当我查看生成的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)。

如何编写与第二个查询类似的查询(在where子句中执行查询),使LINQ to SQL能够执行?

最佳答案

在这种特殊情况下,我认为您需要在Linq语句中连接两个表。这将使您无需使用.SerialNumber.Length关联即可获取SerialNumber的实例。像这样(未经测试):

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;

关于sql-server - LINQ To SQL可以生成无效的SQL吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2106595/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com