当前位置: 首页 > news >正文

分享一个 .NET EF 6 扩展 Where 的方法

image

前言

Entity Framework 6(EF 6)中的 Where 方法用于筛选数据库中的数据并返回符合条件的结果,但 Where 方法只能进行简单的筛选条件,例如相等、大于、小于等简单条件,如果需要处理更复杂的逻辑条件,则需要使用其他方法或手动处理,增加了代码复杂性。

本文分享一个扩展 .NET EF 6 Where 的方法。

代码 & 步骤

  1. 写 Where 的表达扩展类,留意注释

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Linq.Expressions;namespace ERP.DAL.Repository.Extensions
    {/// <summary>/// Linq 表达式扩展类/// </summary>public static class ExpressionExtensions{/// <summary>/// 添加And条件/// </summary>/// <typeparam name="T"></typeparam>/// <param name="first"></param>/// <param name="second"></param>/// <returns></returns>public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> first, Expression<Func<T, bool>> second){return first.AndAlso<T>(second, Expression.AndAlso);}/// <summary>/// 添加Or条件/// </summary>/// <typeparam name="T"></typeparam>/// <param name="first"></param>/// <param name="second"></param>/// <returns></returns>public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> first, Expression<Func<T, bool>> second){return first.AndAlso<T>(second, Expression.OrElse);}/// <summary>/// 合并表达式以及参数/// </summary>/// <typeparam name="T"></typeparam>/// <param name="expr1"></param>/// <param name="expr2"></param>/// <param name="func"></param>/// <returns></returns>private static Expression<Func<T, bool>> AndAlso<T>(this Expression<Func<T, bool>> expr1,Expression<Func<T, bool>> expr2,Func<Expression, Expression, BinaryExpression> func){var parameter = Expression.Parameter(typeof(T));var leftVisitor = new ReplaceExpressionVisitor(expr1.Parameters[0], parameter);var left = leftVisitor.Visit(expr1.Body);var rightVisitor = new ReplaceExpressionVisitor(expr2.Parameters[0], parameter);var right = rightVisitor.Visit(expr2.Body);return Expression.Lambda<Func<T, bool>>(func(left, right), parameter);}/// <summary>/// 继承表达式树的访问者或重写者。/// </summary>private class ReplaceExpressionVisitor : ExpressionVisitor{private readonly Expression _oldValue;private readonly Expression _newValue;public ReplaceExpressionVisitor(Expression oldValue, Expression newValue){_oldValue = oldValue;_newValue = newValue;}public override Expression Visit(Expression node){if (node == _oldValue)return _newValue;return base.Visit(node);}}}
    }
    
  2. 使用

    Expression<Func<hospital, bool>> filter = u => u.status != -1;
    filter = filter.And(c => c.name.Contains("第三医院"));
    filter = filter.Or(c => c.name.Contains("第二医院"));
    List<hospital> list = new List<hospital>();
    list = list.AsQueryable().Where(filter).ToList();
    

总结

通过这个 Where 扩展类,可以很方便地处理更复杂的逻辑条件,比如 OR 逻辑。直接将代码复制到项目即可使用。

往期精彩

  1. 分享一个 .NET 通过监听器拦截 EF 消息写日志的详细例子
  2. 不会使用 EF Core 的 Code First 模式?来看看这篇文章,手把手地教你
  3. EF Core 性能很差?试试这 6 个小技巧
  4. 如何在 EF Core 中使用乐观并发控制
  5. EF Core 在实际开发中,如何分层?

我是老杨,一个奋斗在一线的资深研发老鸟,让我们一起聊聊技术,聊聊程序人生,共同学习,共同进步

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • ES6 字符串的新增方法(二十)
  • P4-AI产品经理-九五小庞
  • 云原生系列 - Jenkins
  • (C++二叉树05) 合并二叉树 二叉搜索树中的搜索 验证二叉搜索树
  • 【JavaScript 算法】最长公共子序列:字符串问题的经典解法
  • [数据集][目标检测]导盲犬拐杖检测数据集VOC+YOLO格式4635张2类别
  • RK3568 V1.4.0 SDK,USB OTG端子不能被电脑识别出adb设备,解决
  • “信息科技风险管理”和“IT审计智能辅助”两个大模块的部分功能详细介绍:
  • 抖音seo短视频矩阵源码系统开发搭建----开源+二次开发
  • 8、添加第三方包
  • Android --- Kotlin学习之路:协程的使用,什么是协程,为什么要用协程?(学习笔记)
  • Docker 和 k8s 之间是什么关系?
  • 通义千问AI模型对接飞书机器人-模型配置(2-1)
  • HarmonyOS ArkUi @CustomDialog 和promptAction.openCustomDialog踩坑以及如何选择
  • Python--PyMySQL 库基础操作笔记
  • [ JavaScript ] 数据结构与算法 —— 链表
  • const let
  • ESLint简单操作
  • golang中接口赋值与方法集
  • iOS 系统授权开发
  • Laravel5.4 Queues队列学习
  • miaov-React 最佳入门
  • RxJS: 简单入门
  • 从零开始学习部署
  • 第十八天-企业应用架构模式-基本模式
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 技术:超级实用的电脑小技巧
  • 思考 CSS 架构
  • 用Visual Studio开发以太坊智能合约
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • # C++之functional库用法整理
  • (3)选择元素——(17)练习(Exercises)
  • (4)STL算法之比较
  • (二)换源+apt-get基础配置+搜狗拼音
  • (附源码)spring boot基于小程序酒店疫情系统 毕业设计 091931
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (三)c52学习之旅-点亮LED灯
  • (循环依赖问题)学习spring的第九天
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • .net core 的缓存方案
  • .Net IOC框架入门之一 Unity
  • .net 反编译_.net反编译的相关问题
  • .NET 通过系统影子账户实现权限维持
  • .NET教程 - 字符串 编码 正则表达式(String Encoding Regular Express)
  • .NET学习教程二——.net基础定义+VS常用设置
  • @Transaction注解失效的几种场景(附有示例代码)
  • [ C++ ] STL_vector -- 迭代器失效问题
  • [.net] 如何在mail的加入正文显示图片
  • [2010-8-30]
  • [20150321]索引空块的问题.txt
  • [20150629]简单的加密连接.txt
  • [Angularjs]ng-select和ng-options
  • [AutoSar]状态管理(五)Dcm与BswM、EcuM的复位实现