Asp.net mvc 使用“帮助重写现有TSQL查询”;“不存在”;LINQ中的子句
我无法将带有“notexist”子句的现有TSQL查询转换为可在ASP.NETMVC应用程序中使用的工作LINQ 这是我现有的查询Asp.net mvc 使用“帮助重写现有TSQL查询”;“不存在”;LINQ中的子句,asp.net-mvc,linq,linq-to-sql,Asp.net Mvc,Linq,Linq To Sql,我无法将带有“notexist”子句的现有TSQL查询转换为可在ASP.NETMVC应用程序中使用的工作LINQ 这是我现有的查询 SELECT OrgID, ContentID, FriendlyTitle FROM ContentRollup CR WHERE OrgID = @sOrgID OR ( OrgID = '*' AND NOT EXISTS ( SELECT NU
SELECT
OrgID,
ContentID,
FriendlyTitle
FROM
ContentRollup CR
WHERE
OrgID = @sOrgID
OR
(
OrgID = '*'
AND NOT EXISTS (
SELECT NULL
FROM ContentRollup
WHERE OrgID = @sOrgID AND ContentID = CR.ContentID
)
)
要查询的表ContentRollup如下所示:
OrgID ContentID FriendlyTitle
------ ---------- ----------------
* xxx111 Default text 1
* xxx222 Default text 2
* xxx333 Default text 3
AAA xxx333 AAA text 3
BBB xxx333 BBB text 3
简而言之,这是一个家庭构建的CMS的一部分,该CMS服务于同一内容的组织特定变体。多年来,它一直为我们服务。OrgID为*的记录是所有Org的默认值,但如果传入OrgID,则会覆盖这些记录
例如,如果我不传入任何内容或CCC,将返回三条*记录。如果我传入AAA,那么前两个默认记录将与AAA记录一起返回。如果我传入BBB,前两条默认记录将与BBB记录一起返回
所以。。。我到底该怎么把这个翻译成LINQ?我尝试了各种版本的.Contains和.Except,但无法使用多个条件
我得到的最接近的是
var result = from c in DB.Content
where (
c.OrgID == orgID
||
(
c.OrgID == "*"
&& !(from c1 in DB.Content
select c1.OrgID)
.Contains(orgID)
)
)
select c;
但是我无法在需要的地方获得“AND ContentID=CR.ContentID”标准。不存在转换为!Any():
完美的正是我需要的。
context.ContentRollup.
Where(cr =>
(cr.OrgID == sOrgId)
||
(
(cr.OrgID == '*')
&&
(!context.ContentRolup.Any(cr2 =>
(cr2.OrgID == sOrgId) &&
(cr2.ContentID == cr.ContentID))
)
).ToList()