Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server LINQ To SQL能否生成无效的SQL?_Sql Server_Linq_Linq To Sql_Expression Trees - Fatal编程技术网

Sql server LINQ To SQL能否生成无效的SQL?

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

我有两个使用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的理解,下面的查询应该同样有效(即使通过比较,它相当残酷…)

然而,当我对数据库执行第二个查询时,我得到一个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;