Работа с datacontext.gettable (), чтобы получить 'QueryProvider'

StackOverflow https://stackoverflow.com/questions/4287983

  •  28-09-2019
  •  | 
  •  

Вопрос

Метод dataContext.gettable () вернет объект типа:

System.data.linq.table.table.

Делая это, я предполагаю, что я не издал звонок в базу данных, чтобы получить всю таблицу. В противном случае LINQ будет несколько неэффективным.

Следовательно, все, что я сделал, это сверлить в мой сильно напечатанный класс DataContext (например, DBDataContext), чтобы захватить ручку, например, его свойство «клиентов», представляющее таблицу клиентов в SQL Server.

Затем я могу получить iQueryable от объекта, возвращаемого GetTable () и до сих пор не попал в базу данных. Т.е. код моего «сервисного слоя» будет Linq к объектам, а не LINQ для SQL.

Делая все это, я уменьшу количество репозиториев, которые мне нужны.

Вопрос:

Вышеуказанные предположения правильные?

Примечание:

Я пытаюсь выяснить способ создания моих запросов, используя интерфейсы и дженерики, чтобы сделать его тестируемыми и всеми, что DOO DAH.

Итак, думая по линии ответа @ Zowen на:

Шаблон репозитория: один класс репозитория для каждого объекта?

Я пытаюсь осуществить

public interface IQueryProvider<T>
{
     TResult Query<TResult>(Func<IQueryable<T>, TResult> query);
}

Я не знаю строго необходимо, но я прохожу через кривую обучения и глядя на архитектурные варианты, которые подойдут мне и как я думаю.

Что я пытаюсь сделать:

Я пытаюсь осуществить следующее для SQL Server вместо MongoDB:

public class MongoQueryProvider<T> : IQueryProvider<T>
{
    private readonly IMongoCollection<T> collection;

    public MongoQueryProvider(IMongoDatabase database)
    {
        this.collection = database.GetCollection<T>();
    }

    public TResult Query<TResult>(Func<IQueryable<T>, TResult> query)
    {
        return query(this.collection.Linq());
    }
}

Я хочу, чтобы получить ручку на GetTable (), а затем напишите мой сервисный слой LINQ код против этого.

Я подозреваю, что мне придется написать интерфейс обертки, чтобы получить эквивалент переменной базы данных Imongodatabase.

Тем не менее, вопрос находится выше, а не этот другой вопрос. Как будто я говорю, я просто учусь здесь. Ни один производственный код не будет больно в этом фильме.

Это было полезно?

Решение

Краткий ответ на ваш вопрос заключается в том, что ваши предположения верны. Вы не доступаете в базу данных через GetTable<>() метод DataContext. Отказ И, когда вы получаете IQueryable Вы также не получаете доступа к базе данных, пока вы не перечислите на нее.

Также см. Если это поможет вам в вашем квесте: Преимущество создания универсального репозитория против конкретного репозитория для каждого объекта?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top