Шаблон или лучшая практика для обработки многопараметрических запросов в C # - PullRequest
1 голос
/ 10 июня 2010

Подход, который я всегда использовал при программировании приложения winforms или wpf для выполнения запросов к базе данных, следующий:

  • Разработка интерфейса с несколькими элементами управления для передачи параметров в мои классы запросов

  • Создание класса «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 средство выбора даты, 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);
}

}

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

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

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

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

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

Ответы [ 2 ]

5 голосов
/ 11 июня 2010

Я не уверен, что полностью понимаю ваш вопрос на 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();

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

3 голосов
/ 10 июня 2010

Вот техника, которую я использую:

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

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

...