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

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

前言

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 逻辑。直接将代码复制到项目即可使用。

往期精彩

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


相关文章
|
2月前
|
SQL 缓存 开发框架
分享一个 .NET EF6 应用二级缓存提高性能的方法
分享一个 .NET EF6 应用二级缓存提高性能的方法
|
16天前
|
监控 安全 API
Docker + .NET API:简化部署和扩展
Docker + .NET API:简化部署和扩展
29 0
|
18天前
|
监控 安全 API
最完美的扩展Docker + .NET API:简化部署和扩展
最完美的扩展Docker + .NET API:简化部署和扩展
42 0
|
2月前
|
存储 开发框架 .NET
ASP.NET Web Api 使用 EF 6,DateTime 字段如何取数据库服务器当前时间
ASP.NET Web Api 使用 EF 6,DateTime 字段如何取数据库服务器当前时间
|
2月前
|
程序员 数据库
分享 2 个 .NET EF 6 只更新某些字段的方法
分享 2 个 .NET EF 6 只更新某些字段的方法
|
2月前
|
开发框架 前端开发 算法
分享 .NET EF6 查询并返回树形结构数据的 2 个思路和具体实现方法
分享 .NET EF6 查询并返回树形结构数据的 2 个思路和具体实现方法
|
2月前
|
SQL 程序员 数据库
总结查看 .NET EF 生成的 SQL 的 3 种方式,亲测可用
总结查看 .NET EF 生成的 SQL 的 3 种方式,亲测可用
|
开发框架 程序员 API
【C#】.net core2.1,通过扩展状态代码页方法对404页面进行全局捕抓并响应信息
在开发一个网站项目时,除了异常过滤功能模块,还需要有针对404不存在的api接口和页面处理功能 本篇文章就来讲讲,如何自定义全局请求状态类来统一处理
216 0
|
SQL 存储 XML
ASP.NET Core 实战:基于 Dapper 扩展你的数据访问方法
ASP.NET Core 实战:基于 Dapper 扩展你的数据访问方法 一、前言 在非静态页面的项目开发中,必定会涉及到对于数据库的访问,最开始呢,我们使用 Ado.Net,通过编写 SQL 帮助类帮我们实现对于数据库的快速访问,后来,ORM(Object Relational Mapping,对象关系映射)出现了,我们开始使用 EF、Dapper、NHibernate,亦或是国人的 SqlSugar 代替我们原来的 SqlHelper.cs。
4238 0