Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C语言中处理多参数查询的模式或最佳实践_C#_Design Patterns_Parameters - Fatal编程技术网

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

C# 在C语言中处理多参数查询的模式或最佳实践,c#,design-patterns,parameters,C#,Design Patterns,Parameters,在编写winforms或wpf应用程序以对数据库执行查询时,我始终采用以下方法: 设计一个带有多个控件的接口,将参数传递给我的查询类 基于Linq或实体框架作为数据源,使用字段、属性和查询方法构建DataAccess类 管理控件生成的事件,传递参数并选择用于检索数据的方法 DataAccess类中的示例: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace

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

设计一个带有多个控件的接口,将参数传递给我的查询类

基于Linq或实体框架作为数据源,使用字段、属性和查询方法构建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()
    };
}
你可以想象,处理所有可以传递的参数组合和决策结构,如果或切换情况正在成为一项巨大的工作。。。我将决策方法分为1个参数、2个参数、3个区域。。。。这给了我一些休息,但今天我不得不停在4个参数区域,我不知道我是累了还是怎么了,但我无法找出一个模式来匹配所有的组合

最后,我的问题是:

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

是否有一种最佳实践或模式可以帮助您


提前感谢

这里是我使用的一种技巧:

使控件名称属性与其对应的数据访问对象属性的名称相同。 将它们添加到面板参数spanel 当用户单击“go”按钮时,在ParametersPanel中的控件上循环,使用反射设置具有相应名称的数据访问对象属性。 然后,您的数据访问框架/api可以根据设置的参数动态地构建查询。
像这样的硬编码巨型开关和查询通常会带来麻烦。

这里是我使用的一种技术:

使控件名称属性与其对应的数据访问对象属性的名称相同。 将它们添加到面板参数spanel 当用户单击“go”按钮时,在ParametersPanel中的控件上循环,使用反射设置具有相应名称的数据访问对象属性。 然后,您的数据访问框架/api可以根据设置的参数动态地构建查询。
像这样的硬编码巨型开关和查询通常会带来麻烦。

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

您可能在一个将所有筛选器都作为可空参数的方法中有此功能,或者筛选器值可能是数据访问类上的其他属性—这取决于您自己

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

您可能在一个将所有筛选器都作为可空参数的方法中有此功能,或者筛选器值可能是数据访问类上的其他属性—这取决于您自己

非常有趣,我会好好看看的,谢谢你。我刚刚意识到我写了1000多行过于复杂的无用代码,谢谢你;非常有趣,我会好好看看的,谢谢你。我刚刚意识到我写了1000多行过于复杂的无用代码,谢谢你;