Работа с datacontext.gettable (), чтобы получить 'QueryProvider'
-
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
Вы также не получаете доступа к базе данных, пока вы не перечислите на нее.
Также см. Если это поможет вам в вашем квесте: Преимущество создания универсального репозитория против конкретного репозитория для каждого объекта?