Make和Expression可用于Linq to EntityFramework表达式

时间:2017-12-06 00:00:40

标签: c# .net entity-framework linq linq-to-entities

我需要能够在LINQ Expression查询中使用以下LINQ to Entities

目前有这样的房产:

[NotMapped]
public Clinic CurrentClinic
{
  get { return AdmissionRoot.CurrentFacility.Compile()(this); }
}

其中称之为:

public static Expression<Func<Admission, Clinic>> CurrentFacility =
         a => a.Person.PersonLocations.Any(p => p.Clinic.FacilityType != (int)Clinic.FacilityTypes.CommunityServices)
                ? a.Person.PersonLocations.Where(p => p.Clinic.FacilityType != (int)Clinic.FacilityTypes.CommunityServices)
                   .OrderByDescending(l => l.TransferDate)
                   .ThenByDescending(l => l.LocationId)
                   .FirstOrDefault().Clinic
                : a.Clinic;

问题是我无法在CurrentClinic语句中使用LINQ to Entities,因为它会出现以下错误:

  

“LINQ to中不支持指定的类型成员'CurrentClinic'   实体“

我是LINQ to Entities表达式的新手,并且希望有人能够重构这一点,以便可以在LINQ to Entities语句中使用,如下所示:

Db.Admissions.Where(
       a => 
            (a.CurrentClinic != null 
              && !a.CurrentClinic.Company.IsHomeCompany 
              && a.ReferralClinicId == clinicid
            ) 
          ||
            (a.CurrentClinic.Company.IsHomeCompany 
              && a.CurrentClinic.ClinicId == clinicid
            )
        );

如果无法在Expression中完成,我可以“添加”其他标准,那么还有其他方法/建议可以在不影响速度的情况下发挥作用吗?

1 个答案:

答案 0 :(得分:0)

这里的问题是因为您在查询中使用CurrentClinic,这不是实体框架可以变成表达式的东西。运行查询的另一种方法可能是

Db.Admissions
    .Select(a => new 
    { 
        CurrentClinic = CurrentFacility(a),
        Admission = a
    })
    .Where(a => 
        (a.CurrentClinic != null && !a.CurrentClinic.Company.IsHomeCompany && a.Admission.ReferralClinicId == clinicid) ||
        (a.CurrentClinic.Company.IsHomeCompany && a.CurrentClinic.ClinicId == clinicid));

注意:这是未经测试但仍应有效。