排名
1
文章
858
粉丝
112
评论
163
.net core自定义项目模板,创建自己的模板项目,使用命令行创建模板项目
尘叶心繁 : 可以可以讲真的我都想弄个模板
net core webapi post传递参数
庸人 :
确实坑哈,我也是下班好了好几次,发现后台传递对象是可以的,但...
.net webapi 返回需要的字段,忽略某些字段,修改字段名等
雨雨雨雨雨辰 : 已精
.net webapi 返回需要的字段,忽略某些字段,修改字段名等
雨雨雨雨雨辰 :
疯狂反射
百度编辑器自定义模板
庸人 : 我建议换个编辑器,因为现在百度富文本已经停止维护了,用tinymec...
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:
50010702506256


欢迎加群交流技术

例如我们要匹配一个集合中的所有关键字,我们首先想到的做法是这样的
- 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)
评价