2010-09-13 4 views
0

Comment créer des expressions Linq pour des classes agrégées? Laissez-moi vous expliquer avec un exemple de ce que j'essaie de faire. Dites, je veux trouver tous les employés avec salaire pas égal à 50000 et voici la structure de classe.Expressions Linq et classes d'agrégat

Employee e1 = new Employee { Name = "Jane", PDetail = new PayDetail { Salary = 100000 } }; 
    Employee e2 = new Employee { Name = "Joe", PDetail = new PayDetail { Salary = 50000 } }; 

    emps.Add(e1); 
    emps.Add(e2); 

//I started doing it this way and this code DOES NOT compile 

var parameter = Expression.Parameter(typeof(PayDetail)); 

var where = Expression.NotEqual(Expression.Property(parameter, "Salary"), Expression.Constant(50000)); 

var pred = Expression.Lambda(where, parameter); 

var query = Enumerable.Where(emps, (Func<PayDetail, Boolean>)pred.Compile()); 

EDIT: Toute aide à la question nulle (comme indiqué dans les commentaires)? Merci

Répondre

0

Vous ne passez pas les arguments corrects à la méthode Enumerable.Where. Vous passez une liste de Employee et une méthode qui fonctionne sur PayDetail. Vous pouvez utiliser

var query = Enumerable 
    .Where(emps.Select(e => e.PDetail), (Func<PayDetail, Boolean>)pred.Compile()); 

ou la version plus courte

var query = emps.Select(e => e.PDetail) 
    .Where((Func<PayDetail, Boolean>)pred.Compile()); 

Ce qui vous permet d'obtenir le droit PayDetails mais pas le droit Employee de. Je crois que vous êtes à la recherche vraiment:

var parameter = Expression.Parameter(typeof(Employee)); 

var where = Expression.NotEqual(Expression.Property(
    Expression.Property(parameter, "PDetail"), "Salary"), 
     Expression.Constant(50000)); 

var pred = Expression.Lambda(where, parameter); 

var query = emps.Where((Func<Employee, Boolean>)pred.Compile()); 
+0

Mais alors comment puis-je obtenir les détails des employés aussi bien pour une condition comme « Les employés qui ont le nom de Jane et le salaire de 100000 »? – DotnetDude

+0

@DotnetDude vérifier mes modifications. –

+0

Wow, ça marche! J'ai regardé beaucoup en ligne avant de poster ceci. Pouvez-vous me diriger vers une ressource Linq en ligne qui s'intéresse aux arbres d'expression et aux éléments avancés? Je ne suis pas vraiment sûr de la façon dont vous avez travaillé. Merci – DotnetDude

Questions connexes