Entity Framework Code First IQueryable - PullRequest
       3

Entity Framework Code First IQueryable

8 голосов
/ 24 июня 2011

Сначала я использую Entity Framework Code и столкнулся с небольшим блокпостом.У меня есть класс "Person", определенный следующим образом:

public class Person
{
    public Guid Id { get; set; }
    public virtual ICollection<History> History { get; set; }
}

и класс "History", определенный следующим образом:

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 ]

5 голосов
/ 24 июня 2011

Поскольку вы запрашиваете IEnumerable (то есть: LINQ to Objects), а не IQueryable (то есть: LINQ to Entities), заданное EF.

Вместо этого вы должны использовать

IEnumerable<History> results = context.History.Where(h => h.Person.Id = "sfssd").OrderBy(h => h.OnDate).Take(50)
0 голосов
/ 25 апреля 2015

Этот вопрос и принятый ответ немного устарели. Такой код, как указывает оригинальный вопрос, загружает всю историю человека из базы данных - не хорошо!

var results = person
    .History
    .OrderBy(h => h.OnDate)
    .Take(50)
    .ToArray();

С EF 6 существует простое решение. Не переставляя запрос, вы можете заставить его работать IQueryable, используя DbContext.Entry метод , DbEntryEntity.Collection метод и DbCollectionEntry.Query метод .

var results = dbContext
    .Entry(person)
    .Collection(p => p.History)
    .Query()
    .OrderBy(h => h.OnDate)
    .Take(50)
    .ToArray();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...