我正在使用Entity Framework Code First并遇到了一个小路障。我有一个“Person”类定义如下:
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();
它似乎为该人提取了所有历史记录,然后在记忆中对其进行排序。关于我缺少什么的任何建议?
提前致谢!
答案 0 :(得分:5)
因为您正在查询由EF给出的IEnumerable
(即:LINQ to Objects)而不是IQueryable
(即:LINQ to Entities)。
相反,你应该使用
IEnumerable<History> results = context.History.Where(h => h.Person.Id = "sfssd").OrderBy(h => h.OnDate).Take(50)
答案 1 :(得分:0)
这个问题和接受的答案都有点陈旧。像这样的代码,就像原始问题一样,从数据库加载人的整个历史记录 - 不好!
var results = person
.History
.OrderBy(h => h.OnDate)
.Take(50)
.ToArray();
使用EF 6 ,有一个简单的解决方案。在不重新排列查询的情况下,您可以使用DbContext.Entry
method,DbEntryEntity.Collection
method和DbCollectionEntry.Query
method以IQueryable
方式运行查询。
var results = dbContext
.Entry(person)
.Collection(p => p.History)
.Query()
.OrderBy(h => h.OnDate)
.Take(50)
.ToArray();