如:            System.Linq.Expressions.Expression<Func<Model.Pub.PVHistory, bool>> where = l
                => l.PVType == 4
                && l.PVTarget == "Guest";
            var count = Factory.CreateInstance.PVHistoryDao.Count(where);如何拆成
System.Linq.Expressions.Expression<Func<Model.Pub.PVHistory, bool>> 
where = l => l.PVType == 4;where +=l =>l.PVTarget == "Guest";
像这种多行的写法谢谢

解决方案 »

  1.   

    其实就是:
    我要把
     => l.PVType == 4                 
    && l.PVTarget == "Guest"; 
    这一句话拆分成两句来写谢谢
      

  2.   

    写一个扩展方法: public static class LambdaExpressionExtensions
    {
    public static Expression<TFunc> And<TFunc>(this Expression<TFunc> expr1, Expression<TFunc> expr2)
    {
    if (expr1.ReturnType != typeof(bool) || expr2.ReturnType != typeof(bool))
    throw new ArgumentException("both lambda expressions must return boolean type");
    if (expr1.Parameters.Zip(expr2.Parameters, (p1, p2) => p1.Type == p2.Type).Any(x => x == false))
    throw new ArgumentException("expr1 and expr2 must have exactly the same parameters"); var p = expr1.Parameters;
    var left = Expression.Invoke(expr1, p);
    var right = Expression.Invoke(expr2, p);
    var expr = Expression.And(left, right);
    return Expression.Lambda<TFunc>(expr, p);
    }
    }然后可以这样调用: Expression<Func<Model.Pub.PVHistory, bool>> where = l => l.PVType >= 4;
    Expression<Func<Model.Pub.PVHistory, bool>> where2 = l=> l.PVTarget == "Guest"; where = where.And(where2);
    var count = Factory.CreateInstance.PVHistoryDao.Count(where);
      

  3.   

    query = xxxx
    query = query.Where(...)
    query = query.Where(...)
    相当于query = xxx.Where(... && ...)类似的
    query = xxxx
    query1 = query.Where(...)
    query2 = query.Where(...)
    query = query1.Union(query2)
    相当于query = xxx.Where(... || ...)
      

  4.   

    query.Where(n=>...).Where(n=>...).Count()
      

  5.   

    额,虽然我有办法写出来,大体方法类似楼上几位,2楼是个很标准的搞法,曹版的就事论事
    但是并不建议,因为逻辑运算并不是只有and,我既然要写扩展就必须考虑,会有OR,会有优先级,这样一来,你的要求无论对你自己还是调用者反而都并不便宜。所以处于我的角度来看,这种扩展比较无意义