前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >动态Linq的逻辑与和逻辑或的条件查询

动态Linq的逻辑与和逻辑或的条件查询

作者头像
深蓝studyzy
发布于 2022-06-16 06:47:42
发布于 2022-06-16 06:47:42
1.6K00
代码可运行
举报
文章被收录于专栏:深蓝居深蓝居
运行总次数:0
代码可运行

最近在做一个数据检索的工作,对一个数据库中的宽表进行多个条件的检索。为了简单方便快捷的完成这个功能,我使用LINQ to SQL+ReportView的方式来完成。

首先需要做的是一个查询界面和写一个数据库查询方法。用户在输入框中输入多个指标,将根据指标的格式生成LINQ的Where语句。这个很容易实现,比如输入“2003 北京 人口”,那么就根据空格将这个字符串分成3个字符串,第一个字符串格式是年份,所以用表中的Year字段进行匹配,第二个字段是地区,所以再用表中的Location进行匹配,第三个是指标,那么就用指标进行匹配,具体的C#代码就是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 public static List<Data2010> SearchData(string itemName)
        {
            using (DataClassesDataContext dc = new DataClassesDataContext())
            {
                var data = from d in dc.Data2010s
                           select d;
                string[] items = itemName.Split(' ');
 
                foreach (string item in items)
                {
                    if (IsYear(item))
                    {
                        int year = Convert.ToInt32(item);
                        data = data.Where(d => d.Year ==year);
                    }
                    else if (IsLocation(item))
                    {
                        string location=item;
                        data = data.Where(d => d.Location == location);
                    }
                    else
                    {
                        string keyword=item;
                        data = data.Where(d => d.Indicator.Contains(keyword));
                    }
                }
 
                return data.ToList();
            }
        }

这个功能还简单,毕竟多个指标之间都是与的关系,但是接下来如果要实现或的关系,那么又该怎么办呢?这个让我伤了几天的脑筋。比如说如果要搜索北京、上海、重庆的2000年和2010年的人口,那么该怎么查呢,我定义了一个简单的语法,如果是或关系的指标,那么就在小括号中用空格隔开。那么查询字符串就变成了:

(北京 上海 重庆)(2000 2010) 人口

这样括号之间是与的关系,括号内的内容是或的关系。

但是真正的难点是如何用LINQ来实现动态的或查询。我第一想到的是Dynamic LINQ(具体参见:这里),这个在之前的项目中用过,特别强大,但是在这里用起来不是很方便,所以又想自己实现一套动态OR查询的方法,结果由于时间和能力有限,也没有做出来,最后终于找到一个很好的类库LinqKit,这个类库中有一个

PredicateBuilder类,可以非常简单的实现动态的逻辑或查询。到网站中下载该类库并添加到项目中,然后引用命名空间,将我们的搜索方法改为如下内容:

public static List<Data2010> SearchData(string itemName) {     using (DataClassesDataContext dc = new DataClassesDataContext())     {         var data = from d in dc.Data2010s                    select d;

        Regex r = new Regex(@"\([^\)]*\)");         var ms = r.Matches(itemName);//匹配括号及其中的内容         if (ms.Count > 0)         {             foreach (Match m in ms)             {                 string name = m.Value.Substring(1, m.Value.Length - 2);//去掉括号,只剩下之间的内容                 string[] items = name.Split(' '); //各个Item之间是or的关系 空格区分

                var predicate = PredicateBuilder.False<Data2010>();                 foreach (string item in items)                 {                     predicate = predicate.Or(WhereCondition(item));//这里就是要用的动态逻辑或查询

//WhereCondition的定义是:Expression<Func<Data2010, bool>> WhereCondition(string item),就是根据item的格式判断该用哪个字段进行匹配

                }                 data = data.Where(predicate);//将最后的predicate传入Where函数,相当于是对括号之间进行逻辑与查询             }             itemName = r.Replace(itemName, " ");//把括号给替换掉,再对括号外的内容进行逻辑与查询         }

        string[] items2 = itemName.Split(' ');

        foreach (string item in items2)         {             data = data.Where(WhereCondition(item));         }

        return data.ToList();     } }

数据库查询函数已经完成,接下来就是要用ReportViewer来展现查询出来的结果绑定到报表中,具体代码如下:

private void BindData(string q) {     var datas = DbOperation.SearchData(q);     this.ReportViewer1.LocalReport.DataSources.Clear();     this.ReportViewer1.LocalReport.DataSources.Add(new Microsoft.Reporting.WebForms.ReportDataSource(                                                        "DataSet1", datas));     this.ReportViewer1.DataBind(); }

这里的DataSet1就是对于rdlc报表的数据源,不能写错。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2011-01-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
LINQ常用扩展方法、委托、Lambda、yield
 每一项数据都会经过predicate的测试,如果针对一个元素,predicate执行的返回值为true,那么这个元素就会放到返回值中。 Where参数是一个lambda表达式格式的匿名方法,方法的参数e表示当前判断的元素对象。参数的名字不一定非要叫e,不过一般lambda表达式中的变量名长度都不长。
鱼找水需要时间
2024/03/23
1140
RDLC(Reportview)报表直接打印,支持所有浏览器,客户可在linux下浏览使用
最近在做一个打印清单的,但是rdlc报表自带的工具栏中的打印按钮只有在ie内核下的浏览器才可以使用(其他的就会 隐藏),这导致了使用火狐和谷歌浏览器还有使用linux系统的客户打印成了问题,于是就自己百度搜,谷歌搜,然后就解决了,下面放上源码
冰封一夏
2019/09/11
2.1K0
Linq 实现 DataTable 行转列
由于工作需要,要把查出来的DataTable实现 行转列, 正好这一阵子在用Linq 就做了一个行转列的小例 子 转换前的table: 转换后的table:  代码里有详细的说明, 还有一些参数我都截
lpxxn
2018/01/31
2.4K0
Linq 实现 DataTable 行转列
Linq基础知识小记一
1、LINQ(语言级集成查询)的作用就是提供一种统一且对称的方式,让程序员在广义的数据上获取和操作数据。广义的数据包括XML文档数据、元数据、System.Data.dll和System.Data.SqlClient.dll提供的DataSet和DataTable等数据、内存数据(Array、Collection)等. 2、Linq To Object是针对实现了IEnumerable<T>的对象操作或获取数据的功能,代码如下: (1)、通过Enumerable的实例方法实现查询 string[] str
郑小超.
2018/01/26
5790
30分钟LINQ教程
      也就是说,在声明一个变量(并且同时给它赋值)的时候,完全不用指定变量的类型,只要一个var就解决问题了
liulun
2022/05/09
8130
多条件动态LINQ 组合查询
本文章转载:http://www.cnblogs.com/wangiqngpei557/archive/2013/02/05/2893096.html
跟着阿笨一起玩NET
2018/09/19
1.6K0
linq to sql的多条件动态查询(上)
linq  to sql的多条件动态查询确实是一件头痛的事情,用表达式树或反射方法要写一大堆代码,有时候想想与其这么复杂,还不如回到手动sql拼接的年代,但是技术总是向前发展的,终归还是要在linq上解决这一问题,无意在网上发现一个还算比较简单的办法,分享一下: void ShowData() { using (DBDataContext db = new DBDataContext(Database.ConnectionString)) {
菩提树下的杨过
2018/01/24
2.5K0
[转自JeffreyZhao]在LINQ to SQL中使用Translate方法以及修改查询用SQL
目前LINQ to SQL的资料不多——老赵的意思是,目前能找到的资料都难以摆脱“官方用法”的“阴影”。LINQ to SQL最权威的资料自然是MSDN,但是MSDN中的文档说明和实例总是显得“大开大阖”,依旧有清晰的“官方”烙印——这简直是一定的。不过从按照过往的经验,在某些时候如果不按照微软划定的道道来走,可能就会发现别样的风景。老赵在最近的项目中使用了LINQ to SQL作为数据层的基础,在LINQ to SQL开发方面积累了一定经验,也总结出了一些官方文档上并未提及的有用做法,特此和大家分享。
菩提树下的杨过
2018/01/24
4.9K0
[转自JeffreyZhao]在LINQ to SQL中使用Translate方法以及修改查询用SQL
动态生成RDLC报表
1、从DataGrid提取(包括最新的增删改)数据,自动生成对应的RDLC报表文件(以流的形式驻存在内存中),用ReportViewer类来展示、打印、排版、预览、分页
NaughtyCat
2020/10/09
8.4K0
动态生成RDLC报表
一文说通异步 LINQ
早期的 LINQ,主要是同步的,直到 C# 8.0 加入 IAsyncEnumerable,LINQ 才真正转向异步。这本来是个非常好的改变,配合 System.Linq.Async 库提供的扩展,可以在诸如 Where、Select、GroupBy 等各种地方用到异步。
老王Plus
2021/11/04
8670
C#规范整理·集合和Linq
LINQ(Language Integrated Query,语言集成查询)提供了类似于SQL的语法,能对集合进行遍历、筛选和投影。一旦掌握了LINQ,你就会发现在开发中再也离不开它。
郑子铭
2023/08/30
2390
C#规范整理·集合和Linq
【深入浅出C#】章节 9: C#高级主题:LINQ查询和表达式
C#高级主题涉及到更复杂、更灵活的编程概念和技术,能够让开发者更好地应对现代软件开发中的挑战。其中,LINQ查询和表达式是C#高级主题中的一项关键内容,具有以下重要性和优势:
喵叔
2023/08/21
2.4K0
Json.NET API-Linq to Json
[翻译]Json.NET API-Linq to Json Basic Operator(基本操作)2010-01-02 03:02 by chenkai, 268 visits, [url=file:///C:/Documents and Settings/Administrator/Application Data/Tencent/QQ/Misc/com.tencent.qzone/qzonepackage/blog/blank.htm#]网摘[/url], 收藏, 编辑 在Json.NET开源的组件的API文档中看到其中有个Linq To Json基本操作.详细看了其中API 中Linq to SQL命名空间下定义类方法.以及实现, 觉得参与Linq 来操作Json从某种程度上提高生成Json字符窜的效率, 特别对数据库中批量的数据. 但是也从侧面也增加程序员编码的难度(如果刚用不熟练情况下 主要是在编码中控制生成Json字符窜正确的格式),另外一个关键借助了Linq对Json数据操作和转换更加直接.Linq To SQL 空间目的使用户利用Linq更加直接创建和查询Json对象. 翻译文档如下: A:Creating Json-(利用Linq快速创建Json Object) 在Newtonsoft.Json.Linq 空间下有多个方法可以创建一个Json对象. 简单方法虽然能够创建,但是对编码而言较多略显累赘.简单创建代码如下: 1 JArray array = new JArray(); 2 JValue text = new JValue("Manual text"); 3 JValue date = new JValue(new DateTime(2000, 5, 23)); 4 5 array.Add(text); 6 array.Add(date); 7 8 string json = array.ToString(); 10 //生成的Json字符窜如下: 11 // [ 12 // "Manual text", 13 // "\/Date(958996800000+1200)\/" 14 // ] JArray是Newtonsoft.Json.Linq空间扩展的类表示一个Json数组.而JValue代表JSON值(字符串,整数,日期等) . 简单利用Linq To SQL创建一个Json Object:
DougWang
2020/02/18
1.4K0
.net 温故知新:【6】Linq是什么
这段代码使用Linq对List列表进行筛选、分组、排序等一系列操作展示了Linq的强大和便捷,那么我们为什么需要学习Linq?可以看到这样一堆逻辑只几行Linq很快就可以实现,如果要我们自己实现方法去处理这个List肯定是比较繁琐的。 Linq是什么?如下是官方文档对于Linq的描述:
SpringSun
2022/09/16
2.7K0
.net 温故知新:【6】Linq是什么
LINQ查询操作符 LINQ学习第二篇
一、投影操作符 1. Select Select操作符对单个序列或集合中的值进行投影。下面的示例中使用select从序列中返回Employee表的所有列: using (NorthwindDataContext db=new NorthwindDataContext()) {     //查询语法     var query =         from e in db.Employees         where e.FirstName.StartsWith("M")        
hbbliyong
2018/03/05
3.1K0
.NET 6中的LINQ功能改进:更高效、更灵活、更易用
语言集成查询(Language Integrated Query,简称LINQ)是.NET Framework的一项重要特性,它提供了一种将查询功能嵌入到C#语言中的方式。通过LINQ,开发人员可以以声明式的方式查询数据,简化了数据访问的代码,提高了开发效率。随着.NET的持续发展,LINQ也在不断演进和改进,以适应新的编程需求。
Michel_Rolle
2024/11/14
2K0
[读书笔记]C#学习笔记六: C#3.0Lambda表达式及Linq解析
前言 最早使用到Lambda表达式是因为一个需求: 如果一个数组是:int[] s = new int[]{1,3,5,9,14,16,22}; 例如只想要这个数组中小于15的元素然后重新组装成一个
一枝花算不算浪漫
2018/05/18
8.5K0
linq to xml复习
虽然linq to xml随着.net framework3.0一起发布N久了,但因为自己以前参考网上的代码封装了一个xml操作类(当时linq to xml还没出来,这个封闭工具类一直也用得很顺手),所以在项目中也几乎极少用linq to xml,最近业余时间学习silverlight,原来针对winform/webform开发写的一些工具库部分要作修改才能用于silverlight,懒得一一移植了,干脆直接用.net内置的得了,何况自己再写一个,也还是这些玩意儿,有现成的不用白不用,整理了一些demo代
菩提树下的杨过
2018/01/23
6740
C#LINQ查询子句
用查询语法表示的表达式,由一组类似于SQL的语法编写的句子组成 LINQ查询表达式必须以from子句开头,并且必须以select或group子句结束,中间可以添加多个子句
MaybeHC
2024/04/23
1020
C#LINQ查询子句
LINQ to Object
LinQ to Object是指对随意IEnumerable或Ienumerable<T>集合使用linq查询.它可取代查询不论什么可枚举的集合.如List<T>,Array或Dictionary<K,V>.
全栈程序员站长
2022/07/13
1.3K0
LINQ to Object
相关推荐
LINQ常用扩展方法、委托、Lambda、yield
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文