加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 过滤使用Linq to SQL查询objectContext

发布时间:2020-12-15 22:01:16 所属栏目:百科 来源:网络整理
导读:我试图搜索一些关于我的方法的例子,但所有问题都不足以达到我想要实现的目标. 为了TLDR的缘故,问题是:我如何使它在普通的sql查询中工作? 使用c# – Winforms with SqlCompact4和Linq to SQL 我的方案涉及一个表单,其中包含所有相关的Db表列作为可用的查询
我试图搜索一些关于我的方法的例子,但所有问题都不足以达到我想要实现的目标.

为了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;
   }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读