WojciechKo
WojciechKo

Reputation: 1531

lambda expression path through Collection Property

I need to get all Students which have Registration on specyfic Realisation.

I was thinking it would be s => s.Registrations.RealisationId == realisationId but it doesn't work :). I'm trying to make this like in the example code but I'm getting:A lambda expression with a statement body cannot be converted to an expression tree. I have no idea how can I write this expression correctly, can anyone help me with this?

I couldn't figure out how to title this question better, sorry.

Database:

public class Student : BaseEntity {
    public int StudentId {get; set;}
    public virtual ICollection<Registration> Registrations {get; set;}
}

public class Registration : BaseEntity {
    public int RegistrationId {get; set;}
    public int StudentId {get; set;}
    public int RealisationId {get; set;}

    public Student Student {get; set;}
    public Realisation Realisation {get; set;}
}

public class Realisation : BaseEntity {
    public int RealisationId {get; set;}
    public virtual ICollection<Registration> Registrations {get; set;}
}

My try:

public IEnumerable<Student> GetByRealisationId(int realisationId) {
    return Context.Set<Student>().Where(s => {
            foreach(Registration r in s.Registrations) {
                if (r.RealisationId == realisationId)
                    return true;
            }
            return false;
    });
}

Upvotes: 1

Views: 144

Answers (1)

Simon Whitehead
Simon Whitehead

Reputation: 65059

You'll need to select the ID's out and use Contains:

return Context.Set<Student>()
    .Where(s => s.Registrations
            .Select(r => r.RealisationId)
            .Contains(realisationId));

Generally this is converted to a WHERE IN clause.

Upvotes: 3

Related Questions