linq 多条件查询
Linq 进行多条件查询的时候使用PredicateBuilder帮助类可以很好的解决。
类的源码:
public static class PredicateBuilder
{
/// <summary>
/// 应用True时:单个AND有效,多个AND有效;单个OR无效,多个OR无效;混合使用时写在AND后的OR有效
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public static Expression<Func<T, bool>> True<T>() { return f => true; }
/// <summary>
/// 应用False时:单个AND无效,多个AND无效;单个OR有效,多个OR有效;混合使用时写在OR后面的AND有效
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
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.Or(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.And(expr1.Body, invokedExpr), expr1.Parameters);
}
}
测试方法: private void testList_True()
{
List<Person> listPerson = new List<Person>()
{
,Name=, Birthday=Convert.ToDateTime("1991-01-01") },
,Name=, Birthday=Convert.ToDateTime("1992-01-01")},
,Name=, Birthday=Convert.ToDateTime("1993-01-01")}
};
var where = PredicateBuilder.True<Person>();
//var where= PredicateBuilder_Object.True<Person>();
//string strUserName = "chm1";
//where = where.And(p => p.Name.Contains(strUserName));
));
string strUserName = "chm1";
where = where.And(p => p.Name.Contains(strUserName));
));
var reulst = listPerson.AsQueryable().Where(where).ToList();
}
private void testList_False()
{
List<Person> listPerson = new List<Person>()
{
,Name=, Birthday=Convert.ToDateTime("1991-01-01") },
,Name=, Birthday=Convert.ToDateTime("1992-01-01")},
,Name=, Birthday=Convert.ToDateTime("1993-01-01")}
};
var where = PredicateBuilder.False<Person>();
string strUserName = "chm1";
where = where.And(p => p.Name.Contains(strUserName));
));
string strUserName2 = "chm3";
where = where.And(p => p.Name.Contains(strUserName2));
var reulst = listPerson.AsQueryable().Where(where).ToList();
}
测试结果:
true: and (v) and (v) or(v)
true: or(x) and (v) or(v)
============================
false: or(v) or(v)
false: and (x) and (x)
false: and (x) or(v) and(v)
linq 多条件查询的更多相关文章
- Linq in条件查询
Linq 实现sql中的not in和in条件查询 T-SQL的IN: Select ProductID, ProductName, CategoryID From dbo.Products Wh ...
- EntityFramework linq 多条件查询,不定条件查询
一.场景描述: 开发的时候,有些查询功能,往往查询的条件是不确定的,用户没有填的不参与到查询中去. 如图1所示,用户可能只要给根据名称来查询即可,有时候开始时间和结束时间并不需要填写. 图 1 二.解 ...
- [C#] Linq 动态条件查询
应用背景:以货品为例,在基础数据中配置货品的判断规则,要根据这个规则筛选出符合条件的集合. 创建货品类 public class Product { public string Name { get; ...
- linq 多条件查询 where 拼接+分页
首先定义一个静态类 public static class QueryAssembly { /// <summary> /// 返回true /// </summary> // ...
- Linq 联合条件查询快捷方法
原方法: public ProductDC[] GetProductQueryCondition(ProductQueryConditionDC filter){//红色为原来的联合条件(之后下面的修 ...
- 转 --简单解决Linq多条件组合问题
本文笔者用清晰的实例,解决了Linq多条件问题,思路十分的清晰,笔者也很细心的做了描述,希望能给你带来帮助. 最近有个项目准备功能改版,师兄吩咐:尽可能地做到万般皆Linq,所以很多东西都要从存储过程 ...
- Rafy 中的 Linq 查询支持(根据聚合子条件查询聚合父)
为了提高开发者的易用性,Rafy 领域实体框架在很早开始就已经支持使用 Linq 语法来查询实体了.但是只支持了一些简单的.常用的条件查询,支持的力度很有限.特别是遇到对聚合对象的查询时,就不能再使用 ...
- Webform中linq to sql多条件查询(小练习)
多条件查询:逐条判断,从第一个条件开始判断,如果满足,取出放入集合,再从集合中查询第二个条件... aspx代码: <body> <form id="form1" ...
- Linq实现字符串拼接多条件查询
Linq实现字符串拼接多条件查询 开发过程中,为提升用户体验,经常会使用到多条件查询,本篇博客介绍如何使用Linq实现字符串拼接多条件查询 一般SQL字符串拼接 1 string sql = &quo ...
随机推荐
- vi编辑器的简单使用
Esc --进入扩展模式 a i o --进入插入模式 w --保存 q --退出 wq!--强制保存退出 p --粘贴 前面加数字表示粘贴多少行 u --复原前一个操作 Carl+r - ...
- [家里蹲大学数学杂志]第047期18 世纪法国数学界的3L
1 Lagrange---78岁 约瑟夫·拉格朗日, 全名约瑟夫·路易斯·拉格朗日 (Joseph-Louis Lagrange 1735~1813) 法国数学家.物理学家. 1736年1月25日生于 ...
- 显示hello
The modern user interface is constructed from visual objects of various sorts. Depending on the oper ...
- maven3 手动安装本地jar到仓库
安装命令: mvn install:install-file -Dfile={Path/to/your/ojdbc.jar} -DgroupId=com.oracle -DartifactId=ojd ...
- android studio新项目时提示:Plugin is too old, please update to a more recent version
今天想写一个程序来测试一下android studo代码,但是创建好项目后,提示: Error:(1, 0) Plugin is too old, please update to a more re ...
- apache 配置https
1.生成密钥# openssl genrsa 1024 > server.key这是用128位rsa算法生成密钥,并保存到server.key文件 2.生成证书请求文件# openssl req ...
- chrome控制台查看控件有没绑定事件[转]
chrome控制台查看btn_comment_submit控件有没绑定事件 function lookEvents (elem) { return $.data ? $.data( elem, ...
- Range-Based for Loops
for ( decl : coll ) { statement } where decl is the declaration of each element of the passed collec ...
- ORACLE-SELECT学习
(一)select格式:SELECT [ ALL | DISTINCT ] <字段表达式1[,<字段表达式2[,…] FROM <表名1>,<表名2>[,…] [W ...
- zk抢主
package com.autonavi.tinfo.t1.traffic.pub.openlr.util; import java.util.Collections;import java.util ...