Svetlozar Stoykov
Svetlozar Stoykov

Reputation: 71

Reusing queries with Entity Framework Core

I'm trying to make some queries using EF-Core and I have the following code

public List<Visitation> GetAllVisitations()
    {
        return this.hospital.Visitations
            .Where(v => v.DoctorId == this.Doctor.Id)
            .Select(v => new Visitation
            {
                Doctor = v.Doctor,
                Patient = v.Patient,
                Date = v.Date,
                Comments = v.Comments
            })
            .ToList();
    }

public List<Visitation> GetVisitationByPatient(int id)
    {
        var patient = this.GetPatientById(id);

        return this.hospital.Visitations
            .Where(v => v.PatientId == patient.Id)
            .Select(v => new Visitation
            {
                Doctor = v.Doctor,
                Patient = v.Patient,
                Date = v.Date,
                Comments = v.Comments
            })
            .ToList();
    }

It is pretty obvious that the Select statement is the same in both methods. However I know that EF Core uses Expression<Func>, rather than Func therefore I do not know how to make an Expression, which can be used in both Select statements.

Upvotes: 0

Views: 727

Answers (1)

Leandro Galluppi
Leandro Galluppi

Reputation: 915

The query won't execute until you call .ToList(). So you may take the partial query up to the .Where() and pass it to a function that adds the Select() portion.

Something like this:

public List<Visitation> GetAllVisitations()
    {
        var query = this.hospital.Visitations
            .Where(v => v.DoctorId == this.Doctor.Id);
            
        return this.addTransformation(query)
                   .ToList();
    }

public List<Visitation> GetVisitationByPatient(int id)
    {
        var patient = this.GetPatientById(id);

        var query = this.hospital.Visitations
                        .Where(v => v.PatientId == patient.Id)
            
        return this.addTransformation(query)
                   .ToList();
    }

public IQueriable<Visitation> AddTransformation(IQueriable<Visitation> query)
{
     return query.Select(v => new Visitation
                {
                    Doctor = v.Doctor,
                    Patient = v.Patient,
                    Date = v.Date,
                    Comments = v.Comments
                });
}

Upvotes: 2

Related Questions