EF 拉姆达 动态拼接查询语句

EF 动态拼接查询语句

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Linq.Expressions;
using System.Security.Cryptography;
using System.Text;

namespace Aliexpress.Common.CommonHelper
{
//public static class PredicateBuilder
//{

// /// <summary>
// /// 机关函数应用True时:单个AND有效,多个AND有效;单个OR无效,多个OR无效;混应时写在AND后的OR有效
// /// </summary>
// /// <typeparam name="T"></typeparam>
// /// <returns></returns>
// public static Expression<Func<T, bool>> True<T>() { return f => true; }

// /// <summary>
// /// 机关函数应用False时:单个AND无效,多个AND无效;单个OR有效,多个OR有效;混应时写在OR后面的AND有效
// /// </summary>
// /// <typeparam name="T"></typeparam>
// /// <returns></returns>
// 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.Or(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.And(expr1.Body, invokedExpr), expr1.Parameters);
// }
//}

public class ParameterRebinder : ExpressionVisitor
{
private readonly Dictionary<ParameterExpression, ParameterExpression> map;

public ParameterRebinder(Dictionary<ParameterExpression, ParameterExpression> map)
{
this.map = map ?? new Dictionary<ParameterExpression, ParameterExpression>();
}

public static Expression ReplaceParameters(Dictionary<ParameterExpression, ParameterExpression> map, Expression exp)
{
return new ParameterRebinder(map).Visit(exp);
}

protected override Expression VisitParameter(ParameterExpression p)
{
ParameterExpression replacement;
if (map.TryGetValue(p, out replacement))
{
p = replacement;
}
return base.VisitParameter(p);
}
}

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<T> Compose<T>(this Expression<T> first, Expression<T> second, Func<Expression, Expression, Expression> merge)
{
// build parameter map (from parameters of second to parameters of first)
var map = first.Parameters.Select((f, i) => new { f, s = second.Parameters[i] }).ToDictionary(p => p.s, p => p.f);

// replace parameters in the second lambda expression with parameters from the first
var secondBody = ParameterRebinder.ReplaceParameters(map, second.Body);

// apply composition of lambda expression bodies to parameters from the first expression
return Expression.Lambda<T>(merge(first.Body, secondBody), first.Parameters);
}

public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> first, Expression<Func<T, bool>> second)
{
return first.Compose(second, Expression.And);
}

public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> first, Expression<Func<T, bool>> second)
{
return first.Compose(second, Expression.Or);
}
}
}
时间: 2024-12-16 00:34:18

EF 拉姆达 动态拼接查询语句的相关文章

生成jFinal的动态条件查询语句的工具类

因为有时候需要根据前台的多个条件来过滤数据!因此需要根据是否有值以及当前值是以什么方式来过滤.这样我们不可能一个一个值来判断吧!这样代码就有些难看了!而jFinal也没有提供这样的方法,而网上的一些解决方法感觉不太好用麻烦而且不够灵活!基于这个考虑我就自己写了一个工具类!目前来说用着还挺方便的!如果有什么不对或者改进的地方请指正,大家共同进步! /**  * 用于生成JFinal的SQL查询语句<br>  * 类名称:Conditions<br>  * 创建人:yangxp<

java动态拼接sql语句并且执行时给sql语句的参数赋值

问题 在这里举一个例子,比如我要做一个多条件模糊查询,用户输入的时候有可能输入一个条件,也有可能输入两个条件,这时执行查询的sql语句就不确定了,但可以用动态拼接sql语句来解决这个问题. 解决方法 1.就拿我上面的那个多条件模糊查询为例,第一步是拼接sql语句,先定义一个通用的sql语句,String sql = "select * from user where 1 = 1 ";这里添加where 1= 1是一个小技巧,方便后面sql语句的拼接. String sql = &quo

获取动态SQL查询语句返回值(sp_executesql)

在写存储过程时经常会遇到需要拼接SQL语句的情况,一般情况下仅仅是为了执行拼接后的语句使用exec(@sql)即可. 而今天的一个存储过程却需要获取动态SQL的查询结果. 需求描述:在某表中根据Id值查询Cost值(表名不确定但表结构确定,如下面的Product表) 如果不考虑获取返回值,我们这样写即可: declare @tableName varchar(50) declare @id varchar(10) declare @cost numeric(18,2) declare @sql

用PredicateBuilder实现Linq动态拼接查询

在使用Linq查询的时候,特别是如果你在使用Entiry Framwork,有时会遇到动态查询的情况(客户的查询条件是不固定的拼接查询).我们能想到的第一方案应该是拼接SQL,的确这样是可以达到我们的目的的.但这样又会破坏程序的一至性,本来使用Entiry Framwork的目标就是用面向对象的方式操纵数据库,这样我们又要开始写SQL语句了. 其实我一开始也是这样做的直到有一天我们部门的美女程序员给我介绍LinqKit,我才开始用PredicateBuilder来拼接Predicate委托. P

动态拼接SQL语句

1.参考官方文档 ? if:字符判断 ? choose (when, otherwise):分支选择 ? trim (where, set):字符串截取:其中where标签封装查询条件,set标签封装修改条件 ? foreach 2.if案例 1)在EmployeeMapper接口中添加一个方法: //携带了哪个字段,查询条件就带上哪个字段的值 public List<Employee> getEmployeeByConditionIf(Employee employee); 2).如果要写下

SQL 动态拼接SQL 语句

USE [PMS_UnifiedDB_15] GO /****** Object: StoredProcedure [dbo].[SP_GetLogInfo] Script Date: 2/11/2015 3:04:13 PM ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: <Author,,Name> --

mysql动态拼接sql语句

begin /**procedure body**/if(m_parameter='') thenset @sqlStr=concat('select id,title,description,msg,logo,notice,views,grade,commenttimes from kmb01',' order by ',m_sort,' ',m_sortType,' limit ',m_index,',',m_length); elseset @sqlStr=concat('select i

动态拼接SQL 语句

public T Get<T>(int id) { Type type = typeof(T); string columnStrings = string.Join(",", type.GetProperties().Select(p=>string.Format("[{0}]"))); string sql = string.Format("select {0} from [{1}] where id={2}", colum

sqlalchemy动态组合查询语句。

if filter_type == 1: search = and_(GameRoom.status ==1,or_( and_(GameRoom.white_user_id == user_id, GameRoom.active_player == 1), and_(GameRoom.black_user_id == user_id, GameRoom.active_player == 0))) elif filter_type == 2: search = and_(GameRoom.sta