2010-09-01 10 views
1

J'ai une requête qui ressemble à ceci:Comment exécuter du code comme une partie de la requête LINQ

var results = from person 
        where <here I need to do something like if person is of type 
Employee, call person.GetSalary() > 100000 but if the person is of type Contractor, I need to execute 
several lines of code before doing a person.GetSalary() > 100000 
        select new {person.Name} 

La difficulté est dans la construction de la clause where. Quelqu'un peut-il m'aider à compléter cette requête?

Répondre

3

Vous pouvez toujours écrire une méthode qui effectue votre vérification logique et l'appeler dans une clause where séparée. Pour ce faire avec LINQ-à-entités, vous devez d'abord matérialiser les résultats en utilisant AsEnumerable():

bool CheckEmployeeOrContractorSalary(Person p, decimal salaryLevel) 
{ 
    // put your employee and contractor logic here... 
    if(p is Employee) { 
     return p.GetSalary() > salaryLevel; } 
    else if(p is Contractor) { 
     // ... your complex logic... 
     return p.GetSalary() > salaryLevel; } 
    else 
     // ??? 
     return false; 
} 

Maintenant, vous pouvez écrire:

var results = from person in (
        (from p in person select new { p.Name }).AsEnumerable()) 
       where CheckEmployeeOrContractorSalary(person, 100000) 
       select new {person.Name}; 
+0

La question est étiquetée "LINQ to Entities"; une méthode personnalisée ne sera pas convertible en SQL, donc si vous faites cela, vous devez filtrer les résultats localement (en appelant AsEnumerable avant le Where) –

+0

@Thomas - Pouvez-vous expliquer pourquoi cette solution ne fonctionnerait pas et oui c'est Linq aux entités. – DotnetDude

+0

Une autre question que j'ai est - comment puis-je déboguer les requêtes linq? Dire que j'ai une requête linq vraiment longue avec un tas de wheres et joint et laisse et j'ai besoin de mettre le point d'arrêt sur l'une des lignes pour vérifier les valeurs. Il semble que ce n'est pas possible. – DotnetDude