欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 维修 > 分享一个 .NET EF 6 扩展 Where 的方法

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

2024/10/24 20:19:29 来源:https://blog.csdn.net/yangshuquan/article/details/140560977  浏览:    关键词:分享一个 .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 在实际开发中,如何分层?

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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com