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. django搭建

    1.进入终端使用虚拟环境安装---pip install django==2.2 2.创建新的工程django-admin startproject bookpro 3.创建app或模块 使用djan ...

  2. Java中正则表达式的使用(常用的方法)

    这两天回想了一下正则表达式的使用,顺便就总结了一下java的javascript中使用正则表达式的用法,需要看javascript中使用正则的朋友可以看我的另一篇总结,下面我就简单的介绍一下java中 ...

  3. Python_爬虫养殖专业户_01

    永远记住,动手比动嘴有价值! 构建一个爬虫的四大步骤: 1. 获取URL url= 2. User-Agent伪装 headers = { 'User-Agent': 'Mozilla/5.0 (Ma ...

  4. PyQt转换显示Python-OpenCV图像实现图形化界面的视频播放

    ☞ ░ 前往老猿Python博文目录 ░ 一.引言 在Python-OpenCV中显示图像时调用的是一个单独的窗口,有时我们需要将这些图像显示在PyQt的图形化界面上,这样就可以将整个图像显示与PyQ ...

  5. ASP.NET Log4net数据库日志新增记录客户端ip

    LOG4数据库记录器XML配置 1 <appender name="ADONetAppender" type="log4net.Appender.ADONetApp ...

  6. jQuery插件的2种类型

    1.封装方法插件  封装方法插件在本质上来说,是一个对象级别的插件,这类插件首先通过jQuery选择器获取对象,并为对象添加方法,然后,将方法进行打包,封闭成一个插件,这种类型的插件编写简单,极易调用 ...

  7. 题解 洛谷 P5279 【[ZJOI2019]麻将】

    这题非常的神啊...蒟蒻来写一篇题解. Solution 首先考虑如何判定一副牌是否是 "胡" 的. 不要想着统计个几个值 \(O(1)\) 算,可以考虑复杂度大一点的. 首先先把 ...

  8. BJOI2015 隐身术

    落谷. Description 给你两个串 \(A.B\).询问 \(B\) 中有多少个非空子串和 \(A\) 的编辑距离不超过 \(K\). Solution 发现 \(K \le 5\),考虑可以 ...

  9. git使用-merge request开发操作步骤

    0. 如果当前不在develop分支,则切换到develop分支 git checkout develop 1. 获取develop分支最新代码 git pull 注意:这一步正常来说应该是一个Fas ...

  10. 测试web-view,实现小程序和网页之间的切换

    官方有句提醒:个人类型与海外类型的小程序暂不支持使用 测试条件: 1.小程序后台管理中,进入"开发设置",设置一个业务域名(注意:不是设置服务器域名).比如 https://tes ...