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

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

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

1、创建一个IQueryable的拓展类

    public static class IQueryableExit
        /// <summary>
        /// 模糊查询一组数据,满足一组数据的模糊查询
        /// </summary>
        /// <typeparam name="T">查询列表类型</typeparam>
        /// <param name="sqlData">查询数据源</param>
        /// <param name="array">模糊查询条件</param>
        /// <param name="propertyName">要模糊查询的属性</param>
        /// <returns>返回模糊查询后的结果</returns>
        public static IQueryable<T> QueryLikeArray<T>(this IQueryable<T> sqlData, IEnumerable<string> 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;
                    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<T>(whereCallExpression);
            return sqlData;

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

        private void Query()
            //查询条件,需要在单位表里面查询到所有包含 "兴业银行"和"广州银行" 字样的单位。
            var array = new List<string> { "兴业银行", "广州银行" };
            //先查普通单位
            var sqlData = this._dataContext.Units.Where(w => w.isGeneral).AsQueryable();
            //调用模糊数组查询
            sqlData = sqlData.QueryLikeArray<Units>(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

虽然是比较浅薄的方式

若大家有更好的方法,请分享,谢谢! 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时//比如是这样一个数组条件:new string[]{"兴业银行","广州银行","xx银行","abc"}我们不想在查询数据后,再对其进行模糊过滤操作,可能因为个人习惯,也可能由于项目需要不急于将Linq 的查询 过早的提交到数据库,我们需要先构建完查询条件最后才ToL
LINQ To SQL 进阶系列》,共七篇,,由 Tom Song 连载于博客园。为更好地学习,整理成带目录的 pdf。版权归原作者所有,本资料仅供合法学习参考。 章节如下: Linq To Sql 进阶系列(一)从映射讲起 1.1 案例 1.2 Linq 1.3 DBML 1.4 关系型数据的映射 Linq To Sql 进阶系列(二)M:M关系 Linq To Sql 进阶系列(三)CUD 和 Log 3.1 CreateDatabase 3.2 Insert 记录 3.2.1 3.2.2 3.2.3 3.3 Update 3.4 Delete 3.5 Log 3.6 更新时的冲突和事务 Linq To Sql 进阶系列(四)User Define Function篇 4.1 UDF 简介 4.2 SVF 4.3 系统函数的映射 4.4 TVF Linq To Sql 进阶系列(五)Store Procedure 篇 5.1 SingleResultSet 5.2 MultipleResultSets 5.3 OutParameters 5.4 Return Value Linq To Sql 进阶系列(六)用 object 的动态查询与保存 Log 篇 6.1 用 object 的查询是什么 6.2 原理 6.3 反射在本方法中的作用 6.4 测试用例及反思 Linq To Sql 进阶系列(七)动态查询续及 CLR 与 SQL 在某些细节上的差别 7.1 object 的动态查询续 7.2 限定字段在某集合中 7.3 CLR 与 SQL 在某些细节上的差别
使用Java语言开发项目的时候,在查询这一方面通常是直接利用查询的SQL语句完成的,但是当我们选择使用Java提供的容器(Array,List,HashMap…)作为临时数据,需要实现查询的功能如何实现呢? 本文将介绍一种模糊查询的方法 public class QuestionInfoManger { String question; //对象动态数组 ArrayList<QuestionInfoManger> Question=new ArrayL
补全代码,通过LINQ实现如下功能: 筛选数组studentArray,筛选条件是名字中包含‘o'的学生信息,并且年龄大于20,将满足条件的学生信息输出到命令行 补全代码,通过LINQ实现如下功能: 筛选数组studentArray,筛选条件是名字中包含‘o'的学生信息,并且年龄大于20,将满足条件的学生信息输出到命令行
有一个很大的string字符串,比如string strText="我爱CSDN我爱CSDN我爱CSDN我爱和 谐CSDN我爱CSDN我爱CSDN",要查找其中的和谐关键字,其中关键中可能存在空格或者Tab键,或者两者组合,该怎么实现这个查询呢?string的的indexOf函数好像只能查找出关键字连续的,对于关键字中有空白符的好像查不到。 最终答案:正则表达式 c#的foreach (M...
说明:与SQL命令中的Where作用相似,都是起到范围限定也就是过滤作用的,而判断条件就是它后面所接的子句。 Where操作包括3种形式,分别为简单形式、关系条件形式、First()形式。下面分别用实例举例下: 1.简单形式: 例如:使用where筛选在伦 sql server 我想做 某个登录名看不到其他数据库,只能看到被授权的数据库,但是这个数据库的所有权不能是这个登录名; 网上找了好多都是deny view any database to public,然后数据库的所有权给登录名; 然后我试过deny view any database to public,然后给db_datareader数据库成员身份给登录名,但是这样登录名在对象资源管理器还是看不到数据库,不过可以用sql去使用被授予db_datareader数据库成员身份的数据库数据,但是这种方法不科学,谁会去记这个数据库所有的表名,存储过程名等。表情包