[英]Entity Framework Code First IQueryable
我正在使用Entity Framework Code First,但遇到了一个小障碍。 我有一个这样定义的“人”类:
public class Person
{
public Guid Id { get; set; }
public virtual ICollection<History> History { get; set; }
}
以及这样定义的“历史”类:
public class History
{
public Guid Id { get; set; }
public virtual Person Owner { get; set; }
public DateTime OnDate { get; set; }
}
但是,当我打电话时:
IEnumerable<History> results = person.History
.OrderBy(h => h.OnDate)
.Take(50)
.ToArray();
似乎会拉取该人的所有历史记录,然后在内存中对其进行排序。 关于我所缺少的任何建议吗?
提前致谢!
因为您正在查询EF给出的IEnumerable
(即:LINQ到对象)而不是IQueryable
(即:LINQ到实体)。
相反,您应该使用
IEnumerable<History> results = context.History.Where(h => h.Person.Id = "sfssd").OrderBy(h => h.OnDate).Take(50)
这个问题和公认的答案都有点老了。 像最初的问题一样,这样的代码将从数据库中加载该人员的整个历史记录-不好!
var results = person
.History
.OrderBy(h => h.OnDate)
.Take(50)
.ToArray();
使用EF 6,有一个简单的解决方案。 无需重新安排查询,就可以通过使用DbContext.Entry
方法 , DbEntryEntity.Collection
方法和DbCollectionEntry.Query
方法使它以IQueryable
方式工作。
var results = dbContext
.Entry(person)
.Collection(p => p.History)
.Query()
.OrderBy(h => h.OnDate)
.Take(50)
.ToArray();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.