2013-08-29 3 views
6

Для моей стажировки Я создаю программу, которая обменивается данными с базой данных на заднем плане. Программа накладывается в режиме MVC (Model-View-Controller).Объект Ориентированный класс запроса Linq2Sql

Для просмотра Я хочу получить доступ к данным через что-то, что я назвал DataAccesLayer (DAL). Поскольку это представление имеет минимальные знания, я хочу, чтобы он передал ID для запроса, который я хочу вызвать. Вызов будет выполняться внутри DAL. Затем с идентификатором я хочу спросить класс, который содержит запросы, чтобы вернуть запрос, а затем выполнить его внутри DAL. Изображение для визуализации.

enter image description here

У меня проблема в том, как выполнить запрос в моей функции чтения. Код для DAL является следующее:

public class DataAccesLayer 
{ 
    private Queries queryloader; 
    private RoadsoftDigitacV8DataContext db; 

    public DataAccesLayer() 
    { 
     queryloader = new Queries(); 
     db = new RoadsoftDigitacV8DataContext(); 
    } 

    public List Read(int ID) 
    { 
     IQueryable query; 
     query = queryloader.GetQuery(ID); 

     return query.ToList(); 

    } 

} 

Код для класса запросов:

public class Queries 
{ 
    private Dictionary<int, IQueryable object> queryDict; 
    private ErrorLoggerWinLog logger; 

    public Queries() 
    { 
     logger = ErrorLoggerWinLog.Instance(); 
     queryDict = new Dictionary<int, IQueryable object>(); 
     queryDict.Add(1, from d in db.Drivers 
         select d); 
    } 

    public object GetQuery(int ID) 
    { 
     var query; 
     if(queryDict.TryGetValue(ID, out query) == false) 
     { 
      logger.WriteLine("Queries", "Could not find the query specified", ErrorLoggerWinLog.loggerlevel.Error); 
     } 
     return query; 
    } 
} 

Я задаюсь вопросом, возможно ли это? Сейчас это не работает. Я, наверное, забываю что-то или что-то важное. Кто-нибудь имеет какой-либо опыт работы с подобной настройкой или должен смотреть на совершенно другое решение?

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

Edit2: Прямо сейчас я изучаю шаблон IRepository, это отличное обучение, спасибо всем, кто нашел время, чтобы комментировать и андерсе!

+0

Хорошее усилие с вопросом, +1 для изображения =] – Sean

+0

Однако ..... Что именно не работает? – Sean

+0

Вам все равно нужно подключить объект контекста db к фактической базе данных. Поскольку у вас есть это сейчас, у вас есть несвязанный контекст. Затем вам нужно будет выполнить запрос через контекст. – ThaMe90

ответ

3

В любое время ваш queryDict имеет только один элемент; единственный раз, когда GetQuery() не регистрирует сообщение об ошибке и не возвращается null есть, когда вы передаете 1 ему. как следствие Read(1) возвращает список всех драйверов, в противном случае выбрасывает NullReferenceException, потому что, ну, query имеет значение null.

Вы должны использовать что-то вроде этого:

public class DriversDAL 
    { 
     private RoadsoftDigitacV8DataContext db; 

     public DriversDAL() 
     { 
      db = new RoadsoftDigitacV8DataContext(); 
     } 

     public Driver GetDriver(int ID) 
     { 
      return db.Drives.Single(d => d.ID == ID); 
     } 

    } 

Если вы хотите, общее решение, вы должны использовать общий дао и Repository картина:

How To Create Generic Data Access Object (DAO) CRUD Methods with LINQ to SQL