我个人学习新技术有一个方法,如果遇到问题会根据以前的经验来寻找一些类似的解决方法。有人会说,如果这个问题在你的学习或者工作生涯中都没有遇到过呢?很简单,通过搜索资料或查阅相关书籍学习别人的经验。

在如今的每个商业应用开发过程中,基本上开发人员都会遇到一个问题,就是如何根据不同的条件构建查询表达式或Sql查询语句。根据之前的使用Hibernate或者JPA的开发经验,自然想到,根据不同的条件判断拼接Hql语句或者叫Jpql语句。但是,在使用EF6开发中遇到这种问题想手动的拼接Lambda查询表达式,有点困难。幸好,通过搜索资料找到了国外高人的解决方案,通过PredicateBuilder实现EF6多条件动态查询。

PredicateBuilder源码

using System;
using System.Linq;
using System.Linq.Expressions;
using System.Collections.Generic; public static class PredicateBuilder
{
public static Expression<Func<T, bool>> True<T> () { return f => true; }
public static Expression<Func<T, bool>> False<T> () { return f => false; } public static Expression<Func<T, bool>> Or<T> (this Expression<Func<T, bool>> expr1,
Expression<Func<T, bool>> expr2)
{
var invokedExpr = Expression.Invoke (expr2, expr1.Parameters.Cast<Expression> ());
return Expression.Lambda<Func<T, bool>>
(Expression.OrElse (expr1.Body, invokedExpr), expr1.Parameters);
} public static Expression<Func<T, bool>> And<T> (this Expression<Func<T, bool>> expr1,
Expression<Func<T, bool>> expr2)
{
var invokedExpr = Expression.Invoke (expr2, expr1.Parameters.Cast<Expression> ());
return Expression.Lambda<Func<T, bool>>
(Expression.AndAlso (expr1.Body, invokedExpr), expr1.Parameters);
}
}

PredicateBuilder其实是LINQKit的一部分,LINQKit是适用于LINQ to SQL和Entity Framework功能增强版拓展工具。

注:如果你在使用LINQ to SQL,你只要把PredicateBuilder加入你的项目即可。但是,如果你在使用Entity Framework框架,你将需要LINQKit提供的AsExpandable功能。所以必须得在你的项目中要么加入LINQKit.dll的引用要么直接拷贝LINQKit的源代码进去。

如何使用PredicateBuilder

以实际项目中用户的多条件查询为例,详细步骤如下:

1、把LINQKit.dll引用或者其源代码加入项目中;

2、在DAL层使用AsExpandable方法查询;

public IQueryable<T> LoadLinqKitEntities(Expression<Func<T, bool>> whereLambda)
{
return db.Set<T>().AsExpandable().Where(whereLambda).AsQueryable();
}
3、在BLL层根据传递的参数拼接动态的Lambda表达式。
internal IList<UserInfo> GetUsersByParam(UserInfo userInfo)
{
Expression<Func<UserInfo, bool>> eps = PredicateBuilder.True<UserInfo>();
if (userInfo.DepartmentId != null&&userInfo.DepartmentId>0)
{
eps = eps.And(u => u.DepartmentId == userInfo.DepartmentId);
}
if (userInfo.Name.Length > 0)
{
eps = eps.And(u => u.RealName.Contains(userInfo.Name));
}
eps = eps.And(u => u.Name != "admin");
return efDal.LoadLinqKitEntities(eps).Select(u => u).ToList();
}
通过以上几步就可以实现在EF6中动态的拼接Lambda表达式,支持动态查询了,动手试试吧。

原创文章,转载请注明: 转载自追风筝的coder

本文链接地址: 使用PredicateBuilder实现EF6多条件动态查询

http://vtocode.com/blog/index.php/2014/12/03/ef6-multi-condition-dynamic-query/

AsExpandable EF多条件查询的更多相关文章

  1. MVC+EF 多条件查询

    根据以前的做法是拼接sql语句,这会增加维护成本,因为sql语句里的内容不会报错,所以在使用ef的时候必须要抛弃拼接sql语句的习惯. 构建实例 List<vyw_user> list = ...

  2. EF:分页查询 + 条件查询 + 排序

    /// <summary> /// linq扩展类---zxh /// </summary> /// <typeparam name="T">& ...

  3. Linq和EF 做 单一条件查询 和 复合条件 查询 以及 多表 联合查询 示例

    单一条件查询: var table2Object = (from t1 in db.table1 join t2 in db.table2 on t1.id equals t2.id select t ...

  4. 动态多条件查询分页以及排序(一)--MVC与Entity Framework版url分页版

    一.前言 多条件查询分页以及排序  每个系统里都会有这个的代码 做好这块 可以大大提高开发效率  所以博主分享下自己的6个版本的 多条件查询分页以及排序 二.目前状况 不论是ado.net 还是EF ...

  5. [翻译 EF Core in Action 2.3] 理解EF Core数据库查询

    Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...

  6. ASP.NET EF(LINQ/Lambda查询)

    EF(EntityFrameWork) ORM(对象关系映射框架/数据持久化框架),根据实体对象操作数据表中数据的一种面向对象的操作框架,底层也是调用ADO.NET ASP.NET MVC 项目会自动 ...

  7. 关于在webapi + ef + 视图 + top查询的问题

    在ef中使用视图中有一种坑是视图没有主键,表现的形式是有些数据会出现重复,解决的方法是手动在视图中添加主键即可 在实际的项目中碰到另一种坑,即使用webapi查询时的一种,现记录情况如下: 1:随便创 ...

  8. jqGrid jqGrid分页参数+条件查询

    HTML <div class="row"> <div class="col-sm-20"> <form id="for ...

  9. Rafy 中的 Linq 查询支持(根据聚合子条件查询聚合父)

    为了提高开发者的易用性,Rafy 领域实体框架在很早开始就已经支持使用 Linq 语法来查询实体了.但是只支持了一些简单的.常用的条件查询,支持的力度很有限.特别是遇到对聚合对象的查询时,就不能再使用 ...

随机推荐

  1. 未能加载文件或程序集“System.Net.Http

    前言 简单说先事情的起因吧,之前的程序写了有一段时间了,最近要添加新的功能.顺手就把NuGet包全部更新到最新版.随之问题就出现了. 开始以为是.NET Framework 库的原因,之前是4.6.1 ...

  2. Vue插槽slot理解与初体验 ~

    一.插槽的理解 1.官网介绍 Vue 实现了一套内容分发的 API,将 <slot> 元素作为承载分发内容的出口. 2.为什么使用插槽 Vue 中有一个重要的概念-组件,可以在开发中将子组 ...

  3. 题解「2017 山东一轮集训 Day1 / SDWC2018 Day1」Set

    题目传送门 题目大意 给出一个长度为 \(n\) 的数组,选出一些数异或之和为 \(s1\),其余数异或之和为 \(s2\),求 \(s1+s2\) 最大时 \(s1\) 的最小值. 思路 你发现如果 ...

  4. 一个神秘的oj2093 花园的守护之神(最小割)

    给定一张无向图,你每次可以将一条路的权值增加1,询问最少增加多少次才会使得\(s->t\)的最短路改变 QwQ一看到这个题,我就用种最小割的感觉 我们可以把最短路上的点取出来,然后做最小割呀!! ...

  5. this指向与call,apply,bind

    this指向与call,apply,bind ❝ 「this」问题对于每个前端同学来说相信都不陌生,在平时开发中也经常能碰到,有时候因为「this」还踩过不少坑,并且「this」问题在面试题中出现的概 ...

  6. Dapr 虚拟机集群部署 (非K8S)

    从2021-10-08号发布4小时Dapr + .NET 5 + K8S实战到今天刚刚一周时间,报名人数到了230人,QQ群人数从80人增加到了260人左右,大家对Dapr的关注度再一次得到了验证,并 ...

  7. Python中is与==区别

    1.在Python中,id是什么?id是内存地址,那就有人问了,什么是内存地址呢? 你只要创建一个数据(对象)那么都会在内存中开辟一个空间,将这个数据临时加在到内存中,那么这个空间是有一个唯一标识的, ...

  8. VMware中Linux虚拟机与Windows主机共享文件夹

    VMware下Linux虚拟机与Windows主机共享文件夹 1. 安装vm-tool 2. 开启共享文件夹 虚拟机->设置->选项->共享文件夹"右边选择"总是 ...

  9. 图解java 多线程模式 读书笔记

    第1章"Single Threaded Execution模式--能通过这座桥的只有一个人" 该模式可以确保执行处理的线程只能是一个,这样就可以有效防止实例不一致. 第⒉章&quo ...

  10. 【UE4 C++】UKismetSystemLibrary 源代码

    // Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "CoreMinimal.h" # ...