我试图搜索一些关于我的方法的例子,但所有问题都与我想要达到的目标不太接近。
对于TLDR,问题是:如何使其在普通的sql查询中工作?
使用c# - Winforms with SqlCompact4和Linq to SQL
我的方案涉及一个表格,其中包含所有相关的Db表格列作为可用于查询的过滤器
然后将每个filtertextbox的文本更改事件作为过滤器,gridview的数据源相应地更新 因为我允许通过其中许多列过滤搜索我试图避免使用一些额外的 代码行。
所以我们说我们只专注于4列
custID,name,email,cellPhone
每个都有相应的TextBox。 我正在尝试进行如下查询:
首先我系统地将所有文本框收集到列表中
var AllFormsSearchFiltersTBXLst = new List<TextBox>();
收集当前表单上所有tbx的代码
var AllFormsSearchFiltersTBXLst = [currentFormHere].Controls.OfType<TextBox>();
所以现在我将所有文本框都作为过滤器,无论它们是否具有任何值 然后检查谁有一些价值
如果文本长度大于零,此过滤器文本框中的forech文本框
表示当前过滤器处于活动状态
然后..第二个列表AllFormsACTIVESearchfiltersTBXLst将只包含有效过滤器
我想要实现的是同样的方式,我没有必须指定每个文本框对象 我只是将它们全部作为一个集合进行循环,并且不必通过它来指定每个
现在我想只使用那些活动过滤器
对dbContext进行过滤所以我不必问当前的tbxName是否是电子邮件 像
query = db.Where(db=>db.email.Contains(TbxEmail.Text));
并且每次10到15列
到目前为止我所得到的并没有实现我前进的目标。 using (SqlCeConnection ClientsConn = new SqlCeConnection(ConfigurationManager.ConnectionStrings["Conn_DB_RCL_CRM2014"].ConnectionString))
{
System.Data.Linq.Table<ContactsClients> db = null;
// get all column names from context
var x =(System.Reflection.MemberInfo[]) typeof(ContactsClients).GetProperties();
using (DB_RCL_CRM2014Context Context = new DB_RCL_CRM2014Context(ClientsConn))
{
if (!Filtered)
db = Context.ContactsClients;//.Where(client => client.Name.Contains("fler"));
else
{
db = Context.ContactsClients;
// filters Dictionary contains the name of textBox and its value
// I've named TBX as Columns names specially so i could equalize it to the columns names when needed to automate
foreach (KeyValuePair<string,string> CurFltrKVP in FiltersDict)
{
foreach (var memberInfo in x)
{
// couldn't find out how to build the query
}
}
}
BindingSource BS_Clients = new BindingSource();
BS_Clients.DataSource = db;
GV_ClientInfo_Search.DataSource = BS_Clients;
使用普通sql时通常做的是
foreach textbox获取其值并将其添加到字符串中作为过滤器
var q =&#34;其中&#34; ;
foreach(tbx CurTBX in ALLFILTERTBX)
{
q +=CurTBX.Name +" LIKE '%" + CurTBX.Text + "%'";
// and some checking of last element in list off cores
}
然后将此字符串作为过滤器传递给主选择查询......这很简单 我如何使它在普通的SQL查询中工作?
答案 0 :(得分:1)
我认为您正在尝试动态获取db
的属性,例如:db.email
根据文本框的循环名称(此处为'email'
)。但是,我建议你以其他方式做。我为每种类型的媒体制作了switch
,例如:email
,name
等。像这样:
// Create a list for the results
var results = new List<YourDBResultTypeHere>();
foreach(tbx CurTBX in ALLFILTERTBX)
{
switch(CurTBX.Name) {
case "email":
results.AddRange(db.Where(db => db.email.Contains(tbx.Text)).ToList());
break;
case "name":
results.AddRange(db.Where(db => db.name.Contains(tbx.Text)).ToList());
break;
}
}
答案 1 :(得分:0)
试试这个
void UpdateGridViewData(bool Filtered=false, Dictionary<string,string> FiltersDict = null)
{
using (SqlCeConnection ClientsConn = new SqlCeConnection(ConfigurationManager.ConnectionStrings["Conn_DB_RCL_CRM2014"].ConnectionString))
{
System.Data.Linq.Table<ContactsClients> db = null;
IEnumerable<ContactsClients> IDB = null;
BindingSource BS_Clients = new BindingSource();
System.Reflection.MemberInfo[] AllDbTblClientsColumns = (System.Reflection.MemberInfo[])typeof(ContactsClients).GetProperties();
using (DB_RCL_CRM2014Context Context = new DB_RCL_CRM2014Context(ClientsConn))
{
if (!Filtered)
{
db = Context.ContactsClients;
BS_Clients.DataSource = db;
}
else
{
string fltr = "";
var and = "";
if (FiltersDict.Count > 1) and = "AND";
for (int i = 0; i < FiltersDict.Count; i++)
{
KeyValuePair<string, string> CurFltrKVP = FiltersDict.ElementAt(i);
if (i >= FiltersDict.Count-1) and = "";
for (int j = 0; j < AllDbTblClientsColumns.Length; j++)
{
if (AllDbTblClientsColumns[j].Name.Equals(CurFltrKVP.Key))
{
fltr += string.Format("{0} Like '%{1}%' {2} ", AllDbTblClientsColumns[j].Name, CurFltrKVP.Value, and);
}
}
}
try
{
IDB = Context.ExecuteQuery<ContactsClients>(
"SELECT * " +
"FROM ContactsCosmeticsClients " +
"WHERE " + fltr
);
BS_Clients.DataSource = IDB;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
GV_ClientInfo_Search.DataSource = BS_Clients;
}
}
}