2010-03-10 5 views
1

Je n'arrive pas à traduire une requête TSQL existante avec une clause "Not Exist" en LINQ de travail pour une utilisation dans une application ASP.NET MVC.Aide à la réécriture de la requête TSQL existante avec clause "Not Exists" dans LINQ

Voici ma requête existante.

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 
     ) 
    ) 

La table interrogée, ContentRollup, ressemble à ceci:

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 

En un mot, cela fait partie d'un CMS-construire la maison qui sert des variations spécifiques Org du même contenu . Cela nous a servi solidement pendant des années. Les enregistrements avec OrgID de * sont des valeurs par défaut pour tous les Orgs, mais ils seront remplacés si un OrgID est passé.

Par exemple, si je ne passe rien ou CCC, les trois * enregistrements seront retournés. Si je passe AAA, alors les deux premiers enregistrements par défaut retourneront ainsi que l'enregistrement AAA. Si je passe en BBB, les deux premiers enregistrements par défaut retourneront ainsi que l'enregistrement BBB.

Alors ... comment je traduis cela en LINQ? J'ai essayé différentes versions de .Contains et .Except mais je n'arrive pas à l'utiliser avec plusieurs critères.

Le plus proche que j'ai obtenu est

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; 

, mais je ne peux pas les critères « et ContentID = CR.ContentID » où je le veux.

Répondre

3

Non existe se traduit Tout():

context.ContentRollup. 
    Where(cr => 
     (cr.OrgID == sOrgId) 
     || 
     (
      (cr.OrgID == '*') 
      && 
      (!context.ContentRolup.Any(cr2 => 
       (cr2.OrgID == sOrgId) && 
       (cr2.ContentID == cr.ContentID)) 
      ) 
     ).ToList() 
+0

Parfait. Exactement ce dont j'avais besoin. – Mike