首页 > 解决方案 > 使用 Entity Framework Core 重用查询

问题描述

我正在尝试使用 EF-Core 进行一些查询,并且我有以下代码

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();
    }

很明显,这两种方法中的 Select 语句是相同的。但是我知道 EF Core 使用 Expression<Func>,而不是 Func,因此我不知道如何制作一个可以在两个 Select 语句中使用的表达式。

标签: c#.netentity-frameworkentity-framework-core

解决方案


在您调用之前,查询不会执行.ToList()。因此,您可以将部分查询带到.Where()并将其传递给添加该Select()部分的函数。

像这样的东西:

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
                });
}

推荐阅读