ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

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

2019-07-08 22:08:51  阅读:258  来源: 互联网

标签:c optimization winforms 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将只包含有效过滤器

我试图实现的是以同样的方式我不必指定每个文本框对象
我只是将它们作为一个集合循环遍历它们,而不必通过它的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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有