У меня проблемы с переводом существующего запроса TSQL с предложением "Not Exist" в рабочий LINQ для использования в приложении ASP.NET MVC.
Вот мой существующий запрос.
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, которая обслуживает специфичные для Org варианты одного и того же контента. Это послужило нам прочно в течение многих лет. Записи с 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» там, где я хочу.