排名
6
文章
6
粉丝
16
评论
8
{{item.articleTitle}}
{{item.blogName}} : {{item.content}}
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:
50010702506256
50010702506256
欢迎加群交流技术
分类:
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;
}但是这样是不行的,每次都会覆盖到前面的
下面这种写法可以实现动态的and,但是不好实现动态or,这种复杂的条件
var query = context.Article;
var queryable = query.Where(a => a.UserId == userid && a.IsDelete != 1 && a.IsPrivate != 1);
//动态构建条件
foreach (string keyword in _keywords)
{
queryable = queryable.Where(a => a.Title.Contains(keyword));
}使用动态组装条件的方法:
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);
当然如果不是动态的部分就非常简单了,直接一起写完就好了,比如下面这些条件都是必须要有的
var predicate = PredicateBuilder.False<Article>(); predicate.And(a => a.UserId == uid && a.Title == _article.Title && (a.IsDelete == null || a.IsDelete != 1));
需要根据某些情况动态添加的条件在进行判断添加即可
//ef的动态条件
if (_article.IsPrivate == 1)
{
predicate.And(a => a.IsPrivate == 1);
}贴一个多条件的多(2019-9-17 时间会改变太多东西)

参考文章:
http://www.albahari.com/nutshell/predicatebuilder.aspx
欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)
评价