2009-11-11 12 views
1

Je suis perdu dans linq-land, essayant de transformer ce SQL (qui donne les résultats dont j'ai besoin) en quelque chose qui fonctionne dans linq/C#. Le résultat se retrouvera dans une SelectList.linq pas dans la requête

select Agencies.AgencyName, Agencies.AgencyId 
from Agencies 
where Agencies.Active = 1 and Agencies.AgencyId not in (
    select distinct Agencies.AgencyId 
    from Agencies, AgenciesDonors 
    where AgenciesDonors.AgencyId = Agencies.AgencyId and 
     AgenciesDonors.DonorId = '73B29E01-8BF0-4EC9-80CA-089BA341E93D') 

La valeur Guid sera transmise à chaque fois.

Aide très appréciée après une longue journée passée à ne rien faire.

EDIT: J'aurais dû dire que je travaille dans un contexte MVC 1.0/EF. Je ne sais pas comment cela change les réponses initiales.

Répondre

1

Cela devrait faire l'affaire

var query = from c in dc.Agencies 
      where c.agencies == 1 && 
        !(from o in dc.AgenciesDonors 
        where o.DonorId = myDonorId 
      select o.AgencyId).Contains(c.AgencyId) 
      select c; 

LINQ to SQL transformera le pas contient en existe pas qui a généralement de meilleures performances qu'un pas dans l'instruction SQL.

1

À moins de manquer quelque chose, il n'est pas nécessaire de placer la table Agencies dans la sous-requête. Donc, quelque chose comme cela devrait fonctionner:

from a in dataContext.Agencies 
where a.Active == 1 && 
     !(from inner in dataContext.AgenciesDonors 
     where inner.DonorId == donorID 
     select inner.AgencyId).Contains(a.AgencyId) 
select a 
0
var query = from a in dc.Agencies 
      let ad = from o in dc.AgenciesDonors 
        where o.DonorId = myDonorId 
        select o.Agencies.AgencyId 
      where a.Active == 1 && !ad.Contains(a.AgencyId) 
      select c; 

Je trouve cela une syntaxe plus propre, car il nie la nécessité d'imbriquer une jointure déclaration sur AgenciesDonors aux agences pour obtenir le agencyId, cela doit exécuter sur un DataContext (dc), puisque o.Agencies.AgencyId dans le « let » déclaration ne fonctionnera que lorsqu'il est exécuté comme IQueryable

+0

Désolé d'être dense, mais que dois-je faire pour obtenir un courant continu avec je suis dans un MVC/EF paramètre et j'ai déjà un db en utilisant EntitySets? – Dale

+0

votre dc devrait être créé lorsque vous ajoutez votre edmx (pour EF), donc votre datacontext est la classe que vous utilisez pour faire des appels à la base de données via EF – Neil