tnblog
首页

ef6动态添加条件

36人阅读 2019/2/10 17:12 评论:0 收藏
分类: EF


例如我们要匹配一个集合中的所有关键字,我们首先想到的做法是这样的

  public List<Article> GetArtByKeys(List<string> _keywords)
   {
            CNBlog_ServerContext ef = EFHelper.GetInstance();

            var query = ef.Art;
            //循环添加条件
            foreach (string keyword in _keywords)
            {
                query.Where(a => a.Title.Contains(keyword));
            }

            List<Art> articles = query.ToList();

            return arts;
   }

但是这样是不行的,每次都会覆盖到前面的



使用动态组装条件的方法:

  public List<Article> GetArticleByKeys(List<string> _keywords)
   {
            CNBlog_ServerContext ef = EFHelper.GetInstance();

            //先构建一个查询条件
            var predicate = PredicateBuilder.False<Art>();
            foreach (string keyword in _keywords)
            {
                //循环去添加条件
                predicate = predicate.Or(a => a.Title.Contains(keyword));
            }
            List<Article> articles = ef.Art.Where(predicate).ToList();

            return articles;
   }


其中需要的工具类PredicateBuilder代码如下,注意相关的名称空间要引入,因为里边用到了扩展方法

   public static class PredicateBuilder
    {
        public static Expression<Func<T, bool>> True<T>() { return f => true; }
        public static Expression<Func<T, bool>> False<T>() { return f => false; }

        public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> expr1,
                                                            Expression<Func<T, bool>> expr2)
        {
            var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>());
            return Expression.Lambda<Func<T, bool>>
                  (Expression.OrElse(expr1.Body, invokedExpr), expr1.Parameters);
        }

        public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> expr1,
                                                             Expression<Func<T, bool>> expr2)
        {

            var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>());
            return Expression.Lambda<Func<T, bool>>
                  (Expression.AndAlso(expr1.Body, invokedExpr), expr1.Parameters);
        }
    }



and,or复杂多条件组合方法

例如我们要组合一个这样的复杂一点的条件

p => p.Price > 100 &&
     p.Price < 1000 &&     (p.Description.Contains ("foo") || p.Description.Contains ("far"))

难点在于or外面是有括号的,要和其他两个条件进行and连接,其实知道思路后就不那么难了


思路:

1:先单独构建好or的条件

var inner = PredicateBuilder.False<Product>();
inner = inner.Or (p => p.Description.Contains ("foo"));
inner = inner.Or (p => p.Description.Contains ("far"));

2:在单独构建好and的条件

var outer = PredicateBuilder.True<Product>();
outer = outer.And (p => p.Price > 100);
outer = outer.And (p => p.Price < 1000);

3:把这两个条件进去and连接一下就搞定了!

outer = outer.And (inner);



参考文章:

http://www.albahari.com/nutshell/predicatebuilder.aspx

请先登录

{{item.title}}

{{item.content}}
不能简单的解决问题,那是设计与做法有问题
博主搜索
文章类别
CSS 5篇
云服务 2篇
Git 4篇
.NET 29篇
Android 0篇
软件架构 4篇
.NET Core 15篇
.NET MVC 3篇
英语 3篇
随笔 3篇
Bootstrap 1篇
Redis 12篇
编辑器 2篇
Js相关 6篇
Layui 2篇
Oracle 7篇
Python 2篇
数据库 2篇
EF 2篇
微信 2篇
前端 1篇
消息队列 1篇
最新文章
为什么要使用webapi而不直接使用controller
net core发布到IIS常见错误
net core依赖注入
NET CORE配置EF连接字符串
Net Core使用依赖注入来装载EF的上下文对象
下载net core
Sqlerver添加用户与授权
net core中使用url编码与解码操作
net core启动报错Unable to configure HTTPS endpoint. No server certificate was specified
.net core使用response
ef6动态添加条件
最新评价
{{item.ArticleTitle}}
{{item.BlogName}} : {{item.Content}}