将WHERE子句中的子查询转换为LINQ

时间:2012-06-11 14:13:39

标签: sql-server linq select where-clause

我在将包含select语句的where子句转换为LINQ-to-SQL时遇到问题。这是SQL片段:

WHERE
(p.prioid IS NULL
OR p.prioid IN (SELECT prioid FROM mc.PRIORITY WITH (NOLOCK) WHERE prioid LIKE '1%' ))
AND s.id IN(@site)
AND (LTRIM(sv.glseg) IN ('703', '704', '705'))
AND (c.crewid IS NULL
OR c.crewid IN (SELECT crewid FROM mc.CREW WITH (NOLOCK) WHERE crewid NOT LIKE '2-%'
AND (crewid LIKE '%MAINT%'
OR crewid LIKE '%ELECT%'
OR crewid LIKE '%INST%')))
AND wot.id IN (SELECT id FROM mc.WORKORDERTYPE WITH (NOLOCK) WHERE id NOT LIKE '%Standing%')

具体来说,我遇到了麻烦:

 WHERE
(p.prioid IS NULL
OR p.prioid IN (SELECT prioid FROM mc.PRIORITY WITH (NOLOCK) WHERE prioid LIKE '1%' ))

我将它翻译成以下LINQ语句,但我确定它不正确:

where (p.prioid = null || p.prioid == "1%") 

2 个答案:

答案 0 :(得分:1)

可以使用Contains()或Any()关键字处理子查询,但性能可能很差,具体取决于您的提供商。

答案 1 :(得分:0)

Linq-To-SQL中LIKE的等价物是Contains,StartsWith,EndsWith。 L2S将它们转换为等效的LIKE语句。

在此处检查类似问题How to do SQL Like % in Linq?

修改

您可以使用

获得与原始子查询完全相同的结果
Any(pr=>pr.prioid.StartsWith("1")

如果p是人物集中的对象,你可以写一些东西

Persons.Any(PR => pr.prioid.StartsWith( “1”))

我不确定L2S是否可以转换此内容或生成的SQL将如何执行。