热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

关于Linqtosql实现模糊查询string数组

前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行,

前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时

//比如是这样一个数组条件:new string[]{"兴业银行","广州银行","xx银行","abc"}

我们不想在查询数据后,再对其进行模糊过滤操作,可能因为个人习惯,也可能由于项目需要不急于将Linq 的查询 过早的提交到数据库,我们需要先构建完查询条件最后才ToList()我的方案是用Expression来组装查询条件代码如下:

 1、创建一个IQueryable的拓展类

    public static class IQueryableExit
    {
        /// 
        /// 模糊查询一组数据,满足一组数据的模糊查询
        /// 
        /// 查询列表类型
        /// 查询数据源
        /// 模糊查询条件
        /// 要模糊查询的属性
        /// 返回模糊查询后的结果
        public static IQueryable QueryLikeArray(this IQueryable sqlData, IEnumerable array, string propertyName)
        {
            if (array == null || array.Count() == 0)
                return sqlData;
            if (string.IsNullOrEmpty(propertyName))
                throw new Exception("QueryLikeArray:propertyName未设置查询属性名称");
            var type = typeof(T);
            ParameterExpression param = Expression.Parameter(type);
            Expression filter1 = null;
            Expression filter2 = null;
            foreach (var item in array)
            {
                filter2 = Expression.Call(Expression.Property(param, type.GetProperty(propertyName)),
                typeof(String).GetMethod("Contains"), new Expression[] { Expression.Constant(item) });
                if (filter1 == null)
                    filter1 = filter2;
                else
                    filter1 = Expression.Or(filter1, filter2);
            }
            Expression pred = Expression.Lambda(filter1, param);
            MethodCallExpression whereCallExpression = Expression.Call(typeof(Queryable), "Where", new Type[] { type }, Expression.Constant(sqlData), pred);
            sqlData = sqlData.Provider.CreateQuery(whereCallExpression);
            return sqlData;
        }
    }

2、使用上面的拓展方法查询

        private void Query()
        {
            //查询条件,需要在单位表里面查询到所有包含 "兴业银行"和"广州银行" 字样的单位。
            var array = new List { "兴业银行", "广州银行" };
            //先查普通单位
            var sqlData = this._dataContext.Units.Where(w => w.isGeneral).AsQueryable();
            //调用模糊数组查询
            sqlData = sqlData.QueryLikeArray(array, "unitName");
            //追加Where条件
            sqlData = sqlData.Where(w => w.enable);
            //最后执行查询
            var t = sqlData.ToList();
        }
查询生成 的SQL 语句

SELECT [t0].[unitName], [t0].[enable], [t0].[isGeneral]....
FROM [dbo].[UNIT] AS [t0]
WHERE ([t0].[enable] = 1) AND (([t0].[unitName] LIKE @p0) OR ([t0].[unitName] LIKE @p1)) AND ([t0].[isGeneral] = 1)
-- @p0: Input NVarChar (Size = 4000; Prec = 0; Scale = 0) [%兴业银行%]
-- @p1: Input NVarChar (Size = 4000; Prec = 0; Scale = 0) [%广州银行%]
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 4.6.1038.0

虽然是比较浅薄的方式

若大家有更好的方法,请分享,谢谢!
END

推荐阅读
  • 开发笔记:9.八大排序
    开发笔记:9.八大排序 ... [详细]
  • 本文深入探讨了HTTP请求和响应对象的使用,详细介绍了如何通过响应对象向客户端发送数据、处理中文乱码问题以及常见的HTTP状态码。此外,还涵盖了文件下载、请求重定向、请求转发等高级功能。 ... [详细]
  • PHP 过滤器详解
    本文深入探讨了 PHP 中的过滤器机制,包括常见的 $_SERVER 变量、filter_has_var() 函数、filter_id() 函数、filter_input() 函数及其数组形式、filter_list() 函数以及 filter_var() 和其数组形式。同时,详细介绍了各种过滤器的用途和用法。 ... [详细]
  • Ihaveastringwithquotesaroundthepathasfollows:我在路径周围有一个带引号的字符串,如下所示:C:\ProgramFiles(x ... [详细]
  • 深入解析for与foreach遍历集合时的性能差异
    本文将详细探讨for循环和foreach(迭代器)在遍历集合时的性能差异,并通过实际代码示例和源码分析,帮助读者理解这两种遍历方式的不同之处。文章内容丰富且专业,旨在为编程爱好者提供有价值的参考。 ... [详细]
  • JavaScript 基础语法指南
    本文详细介绍了 JavaScript 的基础语法,包括变量、数据类型、运算符、语句和函数等内容,旨在为初学者提供全面的入门指导。 ... [详细]
  • 本文将详细探讨Linux pinctrl子系统的各个关键数据结构,帮助读者深入了解其内部机制。通过分析这些数据结构及其相互关系,我们将进一步理解pinctrl子系统的工作原理和设计思路。 ... [详细]
  • 本文详细介绍了 iBatis.NET 中的 Iterate 元素,它用于遍历集合并重复生成每个项目的主体内容。通过该元素,可以实现类似于 foreach 的功能,尽管 iBatis.NET 并未直接提供 foreach 标签。 ... [详细]
  • 本文详细探讨了HTML表单中GET和POST请求的区别,包括它们的工作原理、数据传输方式、安全性及适用场景。同时,通过实例展示了如何在Servlet中处理这两种请求。 ... [详细]
  • 本文探讨了在C++中如何有效地清空输入缓冲区,确保程序只处理最近的输入并丢弃多余的输入。我们将介绍一种不阻塞的方法,并提供一个具体的实现方案。 ... [详细]
  • 本文探讨了使用C#在SQL Server和Access数据库中批量插入多条数据的性能差异。通过具体代码示例,详细分析了两种数据库的执行效率,并提供了优化建议。 ... [详细]
  • Kubernetes 持久化存储与数据卷详解
    本文深入探讨 Kubernetes 中持久化存储的使用场景、PV/PVC/StorageClass 的基本操作及其实现原理,旨在帮助读者理解如何高效管理容器化应用的数据持久化需求。 ... [详细]
  • Python处理Word文档的高效技巧
    本文详细介绍了如何使用Python处理Word文档,涵盖从基础操作到高级功能的各种技巧。我们将探讨如何生成文档、定义样式、提取表格数据以及处理超链接和图片等内容。 ... [详细]
  • 利用决策树预测NBA比赛胜负的Python数据挖掘实践
    本文通过使用2013-14赛季NBA赛程与结果数据集以及2013年NBA排名数据,结合《Python数据挖掘入门与实践》一书中的方法,展示如何应用决策树算法进行比赛胜负预测。我们将详细讲解数据预处理、特征工程及模型评估等关键步骤。 ... [详细]
  • JSOI2010 蔬菜庆典:树结构中的无限大权值问题
    本文探讨了 JSOI2010 的蔬菜庆典问题,主要关注如何处理非根非叶子节点的无限大权值情况。通过分析根节点及其子树的特性,提出了有效的解决方案,并详细解释了算法的实现过程。 ... [详细]
author-avatar
烟花凄美了谁的脸_234
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有