C# 在C语言中处理多参数查询的模式或最佳实践
在编写winforms或wpf应用程序以对数据库执行查询时,我始终采用以下方法: 设计一个带有多个控件的接口,将参数传递给我的查询类 基于Linq或实体框架作为数据源,使用字段、属性和查询方法构建DataAccess类 管理控件生成的事件,传递参数并选择用于检索数据的方法 DataAccess类中的示例: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
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多行过于复杂的无用代码,谢谢你;