实体框架代码First IQueryable

时间:2011-06-24 15:42:35

标签: c# entity-framework-4.1

我正在使用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();

它似乎为该人提取了所有历史记录,然后在记忆中对其进行排序。关于我缺少什么的任何建议?

提前致谢!

2 个答案:

答案 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 methodDbEntryEntity.Collection methodDbCollectionEntry.Query methodIQueryable方式运行查询。

var results = dbContext
    .Entry(person)
    .Collection(p => p.History)
    .Query()
    .OrderBy(h => h.OnDate)
    .Take(50)
    .ToArray();