IQueryable的简单封装

前言

前两天在园子上看到一个问题

半年前我也考虑过这些问题,但由于这样那样的问题,没有尝试去解决.

后来公司用上了 abp vnext ,然后有一部分代码可以这样写

protected override IQueryable<Resource> CreateFilteredQuery(GetResourceDto input)
{
return ReadOnlyRepository.WhereIf(
input.ParentId.HasValue,
item => item.ParentId == input.ParentId
).WhereIf(
input.Id.HasValue,
item => item.Id == input.Id
);
}

用的时候感觉还是有点方便的,但没怎么考虑过如何实现,也就这样一直用着了.

看到上面那个问题之后就想起来了这茬儿.

第一阶段

众所周知,去掉 if 的最简单的方式就是用三元 ()?():()

param = string.IsNullOrEmpty(x.CustomerID)
?param
:param.And(x => x.CustomerID == query.CustomerID);

讲道理,去掉了 if ,但是并没有感觉比用 if 的时候好多少

第二阶段

众所周知,觉得代码不好看(冗余多)的时候,你应该做点封装了

一般 来说,查询时用的应该是 IQueryable<T> Where(......)

所以可以对 IQueryable<T> 封装一些 简单 的扩展方法

public static class QueryClass
{
public static IQueryable<T> WhereIf<T>(this IQueryable<T> query, bool flag, Expression<Func<T, bool>> expression)
{
return flag ? query.Where(expression) : query;
} public static IQueryable<T> WhereIf<T>(this IQueryable<T> query, string flag, Expression<Func<T, bool>> expression)
{
return string.IsNullOrEmpty(flag) ? query : query.Where(expression);
}
}

用的时候就比较简单了

先定义一下(数据库)实体

public class Entity
{
// 可为空
public Guid? Id { get; set; }
// 字符串
public string Name { get; set; }
// 值类型
public int Num { get; set; }
}

以上应该是程序里面用到的最多的3种数据类型了(大概)

然后整点数据

List<Entity> list = new()
{
new Entity { Id = Guid.NewGuid(), Name = "2" },
new Entity { Id = Guid.NewGuid(), Name = "233333" },
new Entity { Id = Guid.NewGuid(), Name = "233333", Num = 233333 },
new Entity { Id = Guid.NewGuid(), Name = "233333", Num = 3 },
new Entity { Id = Guid.NewGuid(), Name = "23" },
......
......
new Entity { Id = Guid.NewGuid(), Name = "23", Num = 2333 },
};

然后前端传了点数据过来

Entity input = new()
{
Id = null,
Name = "233",
Num = 233
};

写条件的时候大概就像下面这样

var result = list.AsQueryable()
.WhereIf(input.Id.HasValue, item => item.Id == input.Id)
.WhereIf(input.Name, item => item.Name.Contains(input.Name))
.WhereIf(input.Num > 0, item => item.Num > input.Num * 20).ToList();

感觉用的时候还是挺方便简洁的

再多做点(过度)封装应该会更好用

第三阶段

抱歉我还在第二层......

IQueryable的简单封装的更多相关文章

  1. Android AsyncTask 深度理解、简单封装、任务队列分析、自定义线程池

    前言:由于最近在做SDK的功能,需要设计线程池.看了很多资料不知道从何开始着手,突然发现了AsyncTask有对线程池的封装,so,就拿它开刀,本文将从AsyncTask的基本用法,到简单的封装,再到 ...

  2. FMDB简单封装和使用

    工具:火狐浏览器+SQLite Manager插件 ; Xcode; FMDB库; 效果: 项目地址: https://github.com/sven713/PackFMDB 主要参考这两篇博客: 1 ...

  3. Android--Retrofit+RxJava的简单封装(三)

    1,继续接着上一篇的讲讲,话说如果像上一篇这样的话,那么我们每一次请求一个结构都要创建一堆的Retrofit对象,而且代码都是相同的,我们可以试试封装一下 先创建一个HttpMethods类,将Ret ...

  4. okhttp3 get post 简单封装

    最近打算在新项目中使用 okhttp3, 简单封装了一下异步 get post 因为 CallBack 也是在子线程中执行,所以用到了 Handler public class MyOkHttpCli ...

  5. python网页请求urllib2模块简单封装代码

    这篇文章主要分享一个python网页请求模块urllib2模块的简单封装代码. 原文转自:http://www.jbxue.com/article/16585.html 对python网页请求模块ur ...

  6. 对pymysql的简单封装

    #coding=utf-8 #!/usr/bin/python import pymysql class MYSQL: """ 对pymysql的简单封装 "& ...

  7. iOS开发——UI篇OC篇&UITableView简单封装

    UITableView简单封装 UITableView时iOS开发中使用最多也是最重的一个UI空间,其实在App Store里面的%80以上的应用都用到了这个控件,所以就给大家介绍一下,前面的文章中也 ...

  8. iOS sqlite 增删改查 简单封装(基于 FMDB)

    /** *  对 sqlite 的使用进行简单封装,仅涉及简单的单表 增删改查 * *  基于 FMDB * *  操作基于 model ,数据库表字段与 model 属性一一对应,对 model 整 ...

  9. ADO简单封装(MFC)

    简单封装了一下,不是很严谨. /************************************************************************/ /* INSTRUC ...

随机推荐

  1. java导出excel并且压缩成zip上传到oss,并下载,使用字节流去存储,不用文件流保存文件到本地

    最近项目上要求实现导出excel并根据条数做分割,然后将分割后的多个excel打包成压缩包上传到oss服务器上,然后提供下载方法,具体代码如下:这里只展示部分代码,获取数据的代码就不展示了 ByteA ...

  2. 全文检索django-haystack+jieba+whoosh

    全文检索里的组件简介 1.什么是haystack? 1. haystack是django的开源搜索框架,该框架支持Solr,Elasticsearch,Whoosh, *Xapian*搜索引擎,不用更 ...

  3. 偏微分方程数值解法的MATLAB源码

    原文出处http://wenku.baidu.com/view/df412e115f0e7cd184253653.html 因为不太喜欢百度文库的格式,所以写到个人博客里面方便使用 <ifram ...

  4. spring java config配置搭建工程资料收集(网文)

    https://blog.csdn.net/poorcoder_/article/details/70231779 https://github.com/lovelyCoder/springsecur ...

  5. springboot多模块项目搭建遇到的问题记录

    废话不多说,直接上问题报错与解决方法. 问题报错一:(报错信息看下方代码) 问题原因:'com.company.logistics.service.company.CompanyService' 未找 ...

  6. PyQt学习随笔:QStandardItemModel使用注意事项

    老猿Python博文目录 老猿Python博客地址 在使用QStandardItemModel或其派生类作为view对象的数据存储时,有如下几点需要注意: 1.如果是多行多列的数据存储,对应视图如果没 ...

  7. 利用反射注册SpringCache的RedisCacheManager缓存信息

    项目开发中,SpringCache是一个非常方便的工具,但是在配置信息注册时,用枚举方式可以满足遍历,但却无法应用在@Cacheable注解里,因此可以通过静态类的方式,借助反射完成缓存信息注册. 配 ...

  8. 安装nginx并安全地配置和启动

    一.安装nginx >>参考文章<< 安装教程,看代码&注释 # .sh # 如果centos服务器是最低安装,则先安装weget yum install -y wge ...

  9. AcWing 311 .月之谜

    大型补档补了一年 题目链接 考虑枚举月之数的数列和,然后展开dp预处理 设当前模数为 \(P\) \(f[i][j][k]\) 表示一共有 i 位数字,数位和为 j,数值和 % P 的值为 K \(f ...

  10. nginx介绍1

    1.1 nginx 是什么? 是一个高性能的web服务器和反向代理服务器 http://www.nginx.cn/ nginx中文手册 1.2 nginx的优点 1 支持高并发:能支持几万并发连接(特 ...