惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
Tenable Blog
H
Heimdal Security Blog
K
Kaspersky official blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
S
Schneier on Security
G
GRAHAM CLULEY
U
Unit 42
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
C
CERT Recently Published Vulnerability Notes
Google DeepMind News
Google DeepMind News
罗磊的独立博客
Stack Overflow Blog
Stack Overflow Blog
阮一峰的网络日志
阮一峰的网络日志
Simon Willison's Weblog
Simon Willison's Weblog
C
Cisco Blogs
Cyberwarzone
Cyberwarzone
T
The Exploit Database - CXSecurity.com
Project Zero
Project Zero
Security Archives - TechRepublic
Security Archives - TechRepublic
www.infosecurity-magazine.com
www.infosecurity-magazine.com
博客园 - 司徒正美
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
V
Visual Studio Blog
博客园 - Franky
Engineering at Meta
Engineering at Meta
WordPress大学
WordPress大学
Jina AI
Jina AI
P
Proofpoint News Feed
P
Proofpoint News Feed
有赞技术团队
有赞技术团队
L
LINUX DO - 最新话题
宝玉的分享
宝玉的分享
N
News and Events Feed by Topic
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
博客园 - 聂微东
T
The Blog of Author Tim Ferriss
Spread Privacy
Spread Privacy
Application and Cybersecurity Blog
Application and Cybersecurity Blog
IT之家
IT之家
S
Security Affairs
博客园 - 叶小钗
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
小众软件
小众软件
N
News | PayPal Newsroom
Cloudbric
Cloudbric
AWS News Blog
AWS News Blog
W
WeLiveSecurity
The Last Watchdog
The Last Watchdog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
NISL@THU
NISL@THU

博客园 - tubo

依赖Asp.net Core的类库 找一款可以插入数学公式的思维导图软件 联想个人云开启Docker并安装常用的Docker 联想个人云无损开启SSH 我只想在Windows Server 2019上build 基于Linux的Docker Gerrit 添加用户 Windows 10 安装过程中,在自定义登录页面进入审核模式 mac远程桌面连接windows 8.1 update,提示: 远程桌面连接无法验证您希望连接的计算机的身份 iOS开发点滴:iPhone屏幕适配 C# Winform中如何让PictureBox的背景透明 ExtJS扩展:扩展grid之toolbar button禁用表达式 ExtJS扩展:扩展grid Extjs扩展:封装Plupload 用NuGet管理程序包时,如果解决方案目录下的packages文件夹中某一个程序包存在2个以上的版本,则会提示错误 User Profile Service服务未登录,无法加载用户配置文件 Windows 8安装杀毒软件avast后,不能用Sysprep进行通用化封装 Nuget 启用数据库迁移的时候一定要把包含DbContext的项目设为启动项目 “PostSharp21”任务意外失败 为什么TFS会自动签出解决方案文件(.sln)?
可动态构造查询条件的表达式类库(1)
tubo · 2013-01-31 · via 博客园 - tubo

Suucha Expression 是一个表达式类,可适用于需要动态构造查询条件的前端(JavaScript)和后端(C#)的代码中。并且提供基于IQueryable的Where扩展。

获取源代码及安装

源代码:http://suuchaexp.codeplex.com

在Visual Studio中通过Nuget控制台安装:

Install-Package SuuchaExp //安装类库
Install-Package SuuchaExpJs //安装js 

基本用法

//Javascript
var searchParameter = new Suucha.SearchParameters();
searchParameter.Page = 1;
searchParameter.PageSize = 20;
searchParameter.Condition = Suucha.Expression.Equal('Name', 'name');
searchParameter.Condition = Suucha.Expression.And(searchParameter.Condition, 
                            Suucha.Expression.Equal('Code', '01'));
//Json序列化后可以发送到服务端
var json = Ext.JSON.encode(searchParameter);

服务端可以直接使用SearchParameters的静态方法FromJson进行反序列化:

var search = SearchParameters.FromJson(json);
var result = query.Where(search.Condition);

SuuchaExpression类及方法

suucha Expression提供三种类型的表达式:

  • SuuchaMemberExpression,成员表达式
  • SuuchaConstantExpression,常量表达式
  • SuuchaBinaryExpression,二元表达式

他们都是继承自SuuchaExpression,SuuchaExpression还提供静态方法来创建这些表达式(Javascript中也有对应的方法)和构造简单的表达式树:

SuuchaMemberExpression Member(string name) 根据成员名称创建一个成员表达式,name格式:"Code", "User.Name"
SuuchaConstantExpression Constant(object value) 创建一个常量表达式
SuuchaBinaryExpression Equal(string left, object right) 创建一个等于的二元表达式,有多个重载
SuuchaBinaryExpression NotEqual(string left, object right) 创建一个不等于的二元表达式,有多个重载
SuuchaBinaryExpression LessThan(string left, object right) 创建一个小于的二元表达式,有多个重载
SuuchaBinaryExpression LessThanOrEqual(string left, object right) 创建一个小于等于的二元表达式,有多个重载
SuuchaBinaryExpression GreaterThan(string left, object right) 创建一个大于的二元表达式,有多个重载
SuuchaBinaryExpression GreaterThanOrEqual(string left, object right) 创建一个大于等于的二元表达式,有多个重载
SuuchaBinaryExpression Like(string left, string right) 创建一个Like操作的二元表达式,left是成员名称,right是要查找的字符串,可以使用通配符:%
SuuchaBinaryExpression NotLike(string left, string right) 创建一个NotLike操作的二元表达式
SuuchaBinaryExpression In(string left, string right) 创建一个In操作的二元表达式,right必须是用逗号分隔的多个值
SuuchaBinaryExpression InLike(string left, string right) 创建一个InLike操作的二元表达式,right必须是用逗号分隔的多个值
SuuchaBinaryExpression And(SuuchaBinaryExpression left, SuuchaBinaryExpression right) 构造一个And操作的二元表达式
SuuchaBinaryExpression Or(SuuchaBinaryExpression left, SuuchaBinaryExpression right) 构造一个Or操作的二元表达式
SuuchaExpression FromJson(string json) 从Json字符串反序列化

基于IQueryable的扩展:

  • IQueryable Where(this IQueryable source, SuuchaExpression expression)
  • IQueryable<T> OrderBy<T>(this IQueryable<T> source, IEnumerable<SuuchaOrderBy> orderBy)

这里需要特别说明的是成员表达式中成员名称可以是Primitive属性(比如Code),也可以是关联属性的Primitive属性(比如User.Name),还支持集合关联属性,通过一个例子来说明下:

有一个角色类Role,一个用户类User,Role中有一个User的集合属性Users,现在需要查找角色的Users中User名称中包含"张"的角色,可以用如下的代码实现:

var condition = SuuchaExpression.Like("Users.Name","");
var result = roles.Where(condition);

SuuchaExpression特别适合需要通过Javascript动态构建查询条件的场景,如果您感兴趣,可以下载源代码或通过nuget安装体验一下。