将Orberby用于Icollection<>在数据库级别或应用程序级别执行

时间:2012-06-05 16:58:55

标签: asp.net-mvc-3 entity-framework

我正在开发一个asp.net mvc 3 Web应用程序,我在.tt文件夹中有一个folloiwng模型类: -

public partial class Patient
{
    public Patient()
    {
        this.Visits = new HashSet<Visit>();
    }

    public int PatientID { get; set; }
   //code goes here...
    public virtual Gender Gender { get; set; }
    **public virtual ICollection<Visit> Visits { get; set; }**

然后在Controller类中我写了以下内容: -

public PartialViewResult ShowOther(int id, int skip, int take )
        {
                ViewBag.take = take;
                Patient patient = repository.GetPatient(id);
               **Visit visit = patient.Visits.OrderByDescending(d => d.Date).Skip(skip).Take(take).SingleOrDefault();**
//code goes here

所以我的问题是,如果在应用程序级别执行以下Orderby patient.Visits.OrderByDescending(d => d.Date).Skip(skip).Take(take).SingleOrDefault();(这意味着将从数据库中重新获取所有访问对象,然后将在应用程序级别完成orderby) OR Orderby将在数据库上执行,只有预期的Visit对象将被传递给应用程序?

我的repository.GetPatient(id);方法如下所示: -

 public Patient GetPatient(int id)
        {
            return entities.Patients.FirstOrDefault(d => d.PatientID == id);        }

BR

2 个答案:

答案 0 :(得分:1)

在调用.ToList()之前,.Single() - 数据库级别。致电.ToList()后,.Single() - 申请级别。


在您的具体示例中,无关紧要,因为对存储库方法中的FirstOrDefault的调用会执行查询并返回结果。

答案 1 :(得分:1)

访问patient.Visits后,延迟加载会加载所有访问您的应用程序。一切都将在您的应用程序中完成。

如果您只想加载一次访问,请尝试以下操作:

entities.ContextOptions.LazyLoadingEnabled = false;
var patient = entities.Patients.FirstOrDefault(d => d.PatientID == id);
var visit = ((EntityCollection<Visit>)patient.Visists).CreateSourceQuery()
                                                      .OrderByDescending(d => d.Date)
                                                      .SingleOrDefault();
                                                      .