c# – 过滤使用Linq to SQL查询objectContext
作者:互联网
我试图搜索一些关于我的方法的例子,但所有问题都不足以达到我想要实现的目标.
为了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将只包含有效过滤器
我试图实现的是以同样的方式我不必指定每个文本框对象
我只是将它们作为一个集合循环遍历它们,而不必通过它的id来指定每一个
现在我想只使用那些活动过滤器对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文本框获取其值并将其作为过滤器添加到字符串中
var q =“where”;
foreach(tbx CurTBX in ALLFILTERTBX)
{
q +=CurTBX.Name +" LIKE '%" + CurTBX.Text + "%'";
// and some checking of last element in list off cores
}
然后将此字符串作为过滤器传递给主选择查询…这很简单
我如何让它在普通的SQL查询中工作?
解决方法:
我认为您正在尝试动态获取db的属性,例如:db.email根据文本框的循环名称(此处为’email’).但是,我建议你以其他方式做.我会为每种类型的属性进行切换,例如:电子邮件,名称等.这样的事情:
// 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;
}
}
标签:c,optimization,winforms,linq-to-sql,sql-server-ce 来源: https://codeday.me/bug/20190708/1406253.html