filterContext for objectContext使用Linq to SQL

时间:2014-02-06 21:21:07

标签: c# winforms optimization linq-to-sql sql-server-ce

我试图搜索一些关于我的方法的例子,但所有问题都与我想要达到的目标不太接近。

对于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查询中工作?

2 个答案:

答案 0 :(得分:1)

我认为您正在尝试动态获取db的属性,例如:db.email根据文本框的循环名称(此处为'email')。但是,我建议你以其他方式做。我为每种类型的媒体制作了switch,例如:emailname等。像这样:

// 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;

            }
        }
    }