2010-12-08 32 views
1

Supposons la table Employee classique auto-référencée où chaque employé peut avoir au plus un ReportsTo, tel que créé avec cet extrait T-SQL et des exemples de données :Existe-t-il une sous-requête pour Linq to Enties comme dans ce T-SQL?

create table Employees 
(
    Id   int identity primary key, 
    Name  nvarchar(30), 
    Region  nvarchar(10), 
    ReportsTo int null 
     foreign key(ReportsTo) references Employees(Id) 
) 

insert into Employees values('Boss','HO',null) 
insert into Employees values('Underling', 'HO', 
     (select Id from Employees where Name='Boss')) 
insert into Employees values('Self Important', 'Region 1', 
     (select Id from Employees where Name='Underling')) 
insert into Employees values('Very Underling', 'Region 1', 
     (select Id from Employees where Name='Self Important')) 

Je peux sélectionner le gestionnaire pour la région 1 avec ce T-SQL

select * from Employees 
where Region = 'Region 1' and 
ReportsTo not in (select Id from Employees where Region = 'Region 1') 

en d'autres termes, le gestionnaire est un employé non à des rapports dans sa région.

Maintenant, comment puis-je déterminer le gestionnaire pour la région 1 en utilisant Linq?

Répondre

4

Que diriez-vous quelque chose comme ceci:

from e in context.Employee 
where e.Region == "Region 1" 
&& !(from e2 in context.Employee 
    where e2.Region == "Region 1" 
    select e2.Id).ToList().Contains(e.ReportsTo) 
select e; 
+0

Merci --- Je pense que vous aurez besoin de lancer la sélection e2.Id comme Int? puisque c'est le type pour e.ReportsTo. Autre que cette modification mineure, il semble faire l'affaire. –

+0

Je ne sais pas pourquoi vous auriez besoin de la distribution, car ils sont tous les deux 'int', sauf si j'ai mal lu votre question. –

+1

Je n'avais pas besoin d'utiliser '.ToList()' en fait, cela me donnait une erreur. Enlever cela fonctionne pour moi comme un charme =) J'espère que cela aide quelqu'un d'autre = D –

0

Je crois que vous pouvez interroger dans les requêtes via Linq. Il ressemble au-dessous

db.Employees.Where(u => u.Region = 'Whatever').Where(u => 
    db.Employees 
    .Where(v => ReportsTo <> 'Whatever') 
    .Select(v => v.Id) 
    .Contains(u.Id) 
) 

cela peut avoir besoin un peu de travail avant qu'il ne soit prêt à partir, mais je pense que c'est l'idée générale