gpt4 book ai didi

c# - 在 C# 中处理多参数查询的模式或最佳实践

转载 作者:太空宇宙 更新时间:2023-11-03 18:18:14 24 4
gpt4 key购买 nike

在编写 winforms 或 wpf 应用程序以对数据库执行查询时,我一直采用的方法如下:

  • 设计一个带有多个控件的界面,以将参数传递给我的查询类
  • 基于 Linq 或 Entity Framework 作为数据源,为查询构建一个包含字段、属性和方法的“DataAccess”类。
  • 管理控件生成的事件,传递参数并选择用于检索数据的方法。

  • 来自 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);
    }

    }

    你能想象吗,处理所有可以传递的参数组合和决策结构(if 或 switch case)正在成为一项巨大的工作......我深入研究了区域中的决策方法(1 个参数,2 个参数,3.. .. 7 个参数),这让我得到了一些休息,但今天我不得不停在 4 个参数区域,我不知道我是累了还是什么,但我想不出一个匹配所有参数的模式组合。

    所以最后我的问题是:

    我确信有一种更简单的方法来处理用户将使用组​​合框而不是文本框或同时使用所有 7 个控件来查询我的数据库的可能性,但我就是想不通。

    是否有可以提供帮助的最佳实践或模式?

    提前致谢

    最佳答案

    我不确定我是否 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();

    您可能在将所有过滤器作为可空参数的方法中使用它,或者过滤器值可能是您的数据访问类上的其他属性——这取决于您。

    关于c# - 在 C# 中处理多参数查询的模式或最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3017663/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com