2010-06-10 1 views
1

подходом я всегда имел в программировании WinForms или WPF приложения для выполнения запросов в базе данных является следующее:шаблона или наилучшая практика для обработки мульти запросов параметров в C#

  • Дизайна интерфейса с несколькими органами управления в передать параметры моим классам запросов

  • Создайте класс DataAccess с полями, свойствами и методами для запросов на основе Linq или Entity Framework в качестве источника данных.

  • Управление событиями, генерируемыми элементами управления, для передачи параметров и выбора метода, используемого для извлечения данных.

Пример из класса DataAccess:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace MyApplication 
{ 
    public class DataAccess 
    { 
     public LinqDataContext db = new LinqDataContext(); 

#region Private Fields 
#region Properties(Constructors) 
#region Methods 

// Sample method 
public List<DataAccess> Mymethod(string valoredata, int esenzione, 
      string valorebatch) 
{ 
    if (esenzione == 0) 
    { 
     return (from elementi in db.IndexTables 
      from elementi2 in db.DocumentTables 
      where elementi.ID == elementi2.ID 
       && elementi.DataScansione == Convert.ToDateTime(valoredata) 
       && elementi.Batch == valorebatch 
       && elementi.NonEsente == true      
      select associazionePropieta(elementi, elementi2)).ToList(); 
    } 
    else if (esenzione == 1) 
    { 
     return (from elementi in db.IndexTables 
      from elementi2 in db.DocumentTables 
      where elementi.ID == elementi2.ID 
       && elementi.DataScansione == Convert.ToDateTime(valoredata) 
       && elementi.Batch == valorebatch 
       && elementi.BiffaturaReddito == false 
       && elementi.FirmaAutocertificazione == false 
       && elementi.NonEsente == false 
      select associazionePropieta(elementi, elementi2)).ToList(); 
    } 
    else 
    { 
     return (from elementi in db.IndexTables 
      from elementi2 in db.DocumentTables 
      where elementi.ID == elementi2.ID 
       && elementi.DataScansione == Convert.ToDateTime(valoredata) 
       && elementi.Batch == valorebatch 
       && (elementi.BiffaturaReddito == true 
        || elementi.FirmaAutocertificazione == true) 
      select associazionePropieta(elementi, elementi2)).ToList(); 
    } 

} 

#endregion 

// From Refactoring... 
private static DataAccess associazionePropieta(IndexTable elementi, 
          DocumentTable elementi2) 
{ 
    return new DataAccess 
    { 
     codiceImpegnativa = elementi.CodiceImpegnativa, 
     nominativo = elementi.Nominativo, 
     codiceFiscale = elementi.CodiceFiscale, 
     dataImpegnativa = elementi.DataImpegnativa, 
     nonEsente = Convert.ToBoolean(elementi.NonEsente), 
     biffaturaReddito = Convert.ToBoolean(elementi.BiffaturaReddito), 
     autocertificazione = Convert.ToBoolean(elementi.FirmaAutocertificazione), 
     codiceEsenzione = elementi.CodiceEsenzione, 
     raoU = Convert.ToBoolean(elementi.RaoU), 
     raoB = Convert.ToBoolean(elementi.RaoB), 
     raoD = Convert.ToBoolean(elementi.RaoD), 
     raoP = Convert.ToBoolean(elementi.RaoP), 
     dataScansione = Convert.ToDateTime(elementi.DataScansione), 
     batch = elementi.Batch, 
     documentID = elementi.DcumentID, 
     path = elementi2.Path, 
     ID = elementi2.ID.ToString() 
    }; 
} 

Вот маленький кусочек из кода "MainWindow", у меня есть 7 управления (1 DatePicker, 3 комбинированные списки и 3 текстовые поля), чтобы использовать в качестве параметров для запроса:

if (datePickerData.SelectedDate != null 
     && comboBatch.SelectedValue == null 
     && comboEsenzione.SelectedValue != null 
     && nome == true 
     && impegnativa == true 
     && fiscale == true) 
{ 
    this.dataGridRisultati.ItemsSource = 
     dati.Mymethod(datePickerData.SelectedDate.ToString(), 
      comboEsenzione.SelectedIndex); 
} 

} 

ли вы можете себе представить, обработку всех комбинаций параметров, которые могут быть переданы и структуру принятия решения (если переключатель или случай) становится огромной работой ... я diveded РИКА (1 параметр, 2 параметра, 3 .... 7 параметров), и это дает мне немного покоя, но сегодня мне просто пришлось остановиться в области 4 параметров, я не знаю, был ли я просто устал или что, но я не мог понять шаблон, соответствующий всем комбинациям.

Итак, наконец, мой вопрос:

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

Есть ли лучшая практика или образец, который мог бы помочь?

Заранее спасибо

ответ

5

Я не уверен, что полностью понимаю ваш вопрос на 100%, но я считаю, что вы спрашиваете, что является эффективным способом структурирования вызовов доступа к данным, когда есть много параметров, но они являются необязательными.

Возможно, вы не знаете, что запросы LINQ могут быть построены поэтапно.Например, подумайте об этом:

var query = from record in datasource 
    select record; 

if (Parameter1HasValue) query = query.Where(record => record.Field1 == Parameter1); 
if (Parameter2HasValue) query = query.Where(record => record.Field2 == Parameter2); 
if (Parameter3HasValue) query = query.Where(record => record.Field3 == Parameter3); 
return query.ToList(); 

Вы мог бы иметь это в методе, который принимает все фильтры, как обнуляемые параметры, или, возможно, значение фильтра и другие свойства на классе доступа к данным - это до вас ,

+0

Очень интересно, я очень хорошо посмотрю на это, таньк ты. –

+0

Я только что понял, что написал более 1000 строк сложного и (на данный момент) бесполезного кода, спасибо вам;) –

+0

Очень полезно, спасибо! – robbpriestley

3

Вот метод я использую:

  1. Сделайте ваши настройки управления Имя так же, как имя доступа к данным объектам собственности, что они соответствуют.
  2. Добавить их на панель (ParametersPanel)
  3. Когда пользователь нажимает кнопку «идти», перебирайте элементы управления в ParametersPanel, задайте свойства объекта доступа к данным с помощью соответствующего отражения.
  4. Объект доступа к данным (или, лучше, структура доступа к данным/api) может затем динамически строить запрос на основе того, какие параметры были установлены.

Жесткие кодирующие гигантские коммутаторы и подобные запросы обычно задают проблемы.

+0

Еще одно интересное решение, спасибо. –

Смежные вопросы