支持楼主,只是有地方不懂  这个函数的返回值是什么 类型啊 Expression <Func <TEntity, bool>> 
我也要做个linq 的动态查询,其它的地方都懂了,可能是我范型不太会,请指点啊

解决方案 »

  1.   

    用linq做动态查询,还不如直接拼字符串直观.
    本来很简单的问题搞复杂了.
    codeporject上有个开源的项目,用来做动态查询是非常不错的.楼主可找找.
      

  2.   

            NorthwindDataContext northwind = new NorthwindDataContext();        var query = northwind.Products
                                 .Where("CategoryID = 3 AND UnitPrice > 3")
                                 .OrderBy("SupplierID");        GridView1.DataSource = query;
            GridView1.DataBind();部分代码        // =, ==, !=, <>, >, >=, <, <= operators
            Expression ParseComparison()
            {
                Expression left = ParseAdditive();
                while (token.id == TokenId.Equal || token.id == TokenId.DoubleEqual ||
                    token.id == TokenId.ExclamationEqual || token.id == TokenId.LessGreater ||
                    token.id == TokenId.GreaterThan || token.id == TokenId.GreaterThanEqual ||
                    token.id == TokenId.LessThan || token.id == TokenId.LessThanEqual)
                {
                    Token op = token;
                    NextToken();
                    Expression right = ParseAdditive();
                    bool isEquality = op.id == TokenId.Equal || op.id == TokenId.DoubleEqual ||
                        op.id == TokenId.ExclamationEqual || op.id == TokenId.LessGreater;
                    if (isEquality && !left.Type.IsValueType && !right.Type.IsValueType)
                    {
                        if (left.Type != right.Type)
                        {
                            if (left.Type.IsAssignableFrom(right.Type))
                            {
                                right = Expression.Convert(right, left.Type);
                            }
                            else if (right.Type.IsAssignableFrom(left.Type))
                            {
                                left = Expression.Convert(left, right.Type);
                            }
                            else
                            {
                                throw IncompatibleOperandsError(op.text, left, right, op.pos);
                            }
                        }
                    }
                    else if (IsEnumType(left.Type) || IsEnumType(right.Type))
                    {
                        if (left.Type != right.Type)
                        {
                            Expression e;
                            if ((e = PromoteExpression(right, left.Type, true)) != null)
                            {
                                right = e;
                            }
                            else if ((e = PromoteExpression(left, right.Type, true)) != null)
                            {
                                left = e;
                            }
                            else
                            {
                                throw IncompatibleOperandsError(op.text, left, right, op.pos);
                            }
                        }
                    }
                    else
                    {
                        CheckAndPromoteOperands(isEquality ? typeof(IEqualitySignatures) : typeof(IRelationalSignatures),
                            op.text, ref left, ref right, op.pos);
                    }
                    switch (op.id)
                    {
                        case TokenId.Equal:
                        case TokenId.DoubleEqual:
                            left = GenerateEqual(left, right);
                            break;
                        case TokenId.ExclamationEqual:
                        case TokenId.LessGreater:
                            left = GenerateNotEqual(left, right);
                            break;
                        case TokenId.GreaterThan:
                            left = GenerateGreaterThan(left, right);
                            break;
                        case TokenId.GreaterThanEqual:
                            left = GenerateGreaterThanEqual(left, right);
                            break;
                        case TokenId.LessThan:
                            left = GenerateLessThan(left, right);
                            break;
                        case TokenId.LessThanEqual:
                            left = GenerateLessThanEqual(left, right);
                            break;
                    }
                }
                return left;
            }
    文件太大到我的下载中下载
    http://download.csdn.net/source/1726289