用帮助类生成动态表达式使用linq语句查询,但是生成的sql语句报错
1、帮助类:
public static Expression<Func<T, bool>> True<T>() { return param => true; } public static Expression<Func<T, bool>> False<T>() { return param => false; } /// <summary> /// 组合And /// </summary> /// <returns></returns> public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> first, Expression<Func<T, bool>> second) { return first.Compose(second, Expression.AndAlso); } /// <summary> /// 组合Or /// </summary> /// <returns></returns> public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> first, Expression<Func<T, bool>> second) { return first.Compose(second, Expression.OrElse); } /// <summary> /// Combines the first expression with the second using the specified merge function. /// </summary> static Expression<T> Compose<T>(this Expression<T> first, Expression<T> second, Func<Expression, Expression, Expression> merge) { var map = first.Parameters .Select((f, i) => new { f, s = second.Parameters[i] }) .ToDictionary(p => p.s, p => p.f); var secondBody = ParameterRebinder.ReplaceParameters(map, second.Body); return Expression.Lambda<T>(merge(first.Body, secondBody), first.Parameters); }
2、声明:
var expression = LinqExtensions.True<Logis_shouhuoHeader>(); var expression2 = LinqExtensions.True<Logis_fahuoHeader>();
3、表达式赋值:
if (!StringExtensions.IsEmpty(queryParam["fahuorenName"].ToString())) { string keyword = queryParam["fahuorenName"].ToString(); expression = expression.And(t => t.fahuorenName.Contains(keyword)); } if (!StringExtensions.IsEmpty(queryParam["liushuihao"].ToString())) { string keyword = queryParam["liushuihao"].ToString(); expression = expression.And(t => t.liushuihao.Contains(keyword)); }
4、使用:
tempall = db.Queryable<Logis_shouhuoHeader>() .JoinTable<Logis_fahuoDetail>((s1, s2) => s1.ID == s2.shouhuoHeaderID, JoinType.INNER) .JoinTable<Logis_fahuoDetail, Logis_fahuoHeader>((s1, s2, s3) => s2.HeaderID == s3.ID, JoinType.INNER).Where(expression)
5、生成:
EXEC sp_executesql N'SELECT COUNT(1) FROM [Logis_shouhuoHeader] s1 INNER JOIN [Logis_fahuoDetail] s2 ON ( s1.ID = s2.shouhuoHeaderID ) INNER JOIN [Logis_fahuoHeader] s3 ON ( s2.HeaderID = s3.ID ) WHERE 1=1 AND ( ( (1=1) AND ([param].[DateTihuo] >= @param_DateTihuo301) ) AND ([param].[DateTihuo] <= @param_DateTihuo302) ) ', N'@param_DateTihuo301 datetime,@param_DateTihuo302 datetime', @param_DateTihuo301 = '2017-05-02 00:00:00', @param_DateTihuo302 = '2017-05-03 23:59:59';
6、最后:sql错误:动态生成的是[param]并没有在前面做生成标记,所以执行sql报错
消息 4104,级别 16,状态 1,第 1 行 无法绑定由多个部分组成的标识符 "param.DateTihuo"。 消息 4104,级别 16,状态 1,第 1 行 无法绑定由多个部分组成的标识符 "param.DateTihuo"。
这样的错误如何处理???????是哪里出了问题????