Помогите переписать существующий запрос TSQL с предложением «Not Exists» в LINQ - PullRequest
1 голос
/ 10 марта 2010

У меня проблемы с переводом существующего запроса 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» там, где я хочу.

1 Ответ

3 голосов
/ 10 марта 2010

Не существует переводится как! Любой ():

context.ContentRollup.
    Where(cr => 
        (cr.OrgID == sOrgId) 
        || 
        (
            (cr.OrgID == '*') 
            && 
            (!context.ContentRolup.Any(cr2 => 
                 (cr2.OrgID == sOrgId) && 
                 (cr2.ContentID == cr.ContentID))
            )
        ).ToList()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...