Различия между .CreateObjectSet <T>, .Set <T>и .CreateQuery <T>? - PullRequest
10 голосов
/ 21 января 2012

Я пишу универсальный репозиторий для структуры сущностей, и меня смущает разница между этими вызовами:

ObjectContext.CreateObjectSet<T>
ObjectContext.CreateQuery<T>
DbContext.Set<T>

Мне нужен универсальный репозиторий, который поддерживает контекст, сгенерированный из файлов .edmx, а также код, сначала DbContext, поэтому у меня есть это:

 public abstract class EntityRepository<TClass>
   where TClass : class, new()
{
    //private readonly TContext _context;
    private readonly ObjectSet<TClass> _objectSet;

    protected EntityRepository(IObjectContextAdapter context)
    {
        _objectSet = context.ObjectContext.CreateObjectSet<TClass>();

    }

    protected EntityRepository(ObjectContext context)
    {
        _objectSet = context.CreateObjectSet<TClass>();
    }

    public ObjectSet<TClass> Query()
    {
        return _objectSet;
    }
}

В примерах, которые я видел в Интернете, я видел все 3 использованных, каковы фактические различия между ними? Является ли одна лучшая производительность мудрее? Я знаю, что вы можете писать запросы LINQ в контексте, используя все 3 метода.

Ответы [ 2 ]

16 голосов
/ 21 января 2012

CreateObjectSet<T> возвращает вам ObjectSet<T>, который в основном представляет собой коллекцию объектов T, с возможностью добавлять, удалять, ... объект из этих коллекций, что приводит к вставке, удалению, ... Вы также можете использовать его для запросов,Это похоже на корень верхнего уровня для данной сущности.

CreateQuery<T> дает вам ObjectQuery<T>, который можно просмотреть как IEnumerable<T> (это также IQueryable<T>).Этот объект похож на подмножество ObjectSet<T> (некоторые условия и т. Д.), Но вы не можете добавлять к нему элементы и т. Д.

И, наконец, Set<T> возвращает DbSet<T>, что является упрощенной версией первогометод / объект для Code First.Например, проще использовать эти объекты (или лучше сказать интерфейсы; IDbSet<T>), т. Е. Для модульного тестирования и т. Д. Подобно тому, что такое ObjectContext и DbContext.

4 голосов
/ 21 января 2012

В дополнение к тому, что Jiri уже объяснил, существует перегрузка CreateObjectSet, которая не принимает аргументов. Эта перегрузка автоматически предполагает, что она должна вернуть ObjectSet для единственного EntitySet, связанного с TEntity. Он выдаст, если модель имеет MEST (множественные наборы сущностей для каждого типа). Для всех перегрузок CreateQuery требуется строка Entity SQL для начальной загрузки запроса (обратите внимание, что имя EntitySet является допустимым запросом Entity SQL).

...