繁体   English   中英

实体框架代码优先的IQueryable

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM