Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq查询:转换局部变量引用_C#_Linq - Fatal编程技术网

C# Linq查询:转换局部变量引用

C# Linq查询:转换局部变量引用,c#,linq,C#,Linq,我需要将linq查询中的局部变量引用转换为其值。 为此,我使用该类在查询中执行translate局部变量引用: public static class Evaluator { public static Expression PartialEval(Expression expression, Func<Expression, bool> fnCanBeEvaluated) { return new SubtreeEvaluator(new Nom

我需要将linq查询中的局部变量引用转换为其值。 为此,我使用该类在查询中执行translate局部变量引用:

public static class Evaluator 
{
    public static Expression PartialEval(Expression expression, Func<Expression, bool> fnCanBeEvaluated) 
    {
        return new SubtreeEvaluator(new Nominator(fnCanBeEvaluated).Nominate(expression)).Eval(expression);
    }

    public static Expression PartialEval(Expression expression) 
    {
        return PartialEval(expression, Evaluator.CanBeEvaluatedLocally);
    }

    private static bool CanBeEvaluatedLocally(Expression expression)
    {
        return expression.NodeType != ExpressionType.Parameter;
    }

    class SubtreeEvaluator: ExpressionVisitor
    {
        HashSet<Expression> candidates;

        internal SubtreeEvaluator(HashSet<Expression> candidates) 
        {
            this.candidates = candidates;
        }

        internal Expression Eval(Expression exp) 
        {
            return this.Visit(exp);
        }

        protected override Expression Visit(Expression exp) 
        {
            if (exp == null) 
            {
                return null;
            }

            if (this.candidates.Contains(exp)) 
            {
                return this.Evaluate(exp);
            }

            return base.Visit(exp);
        }

        private Expression Evaluate(Expression e) 
        {
            if (e.NodeType == ExpressionType.Constant) 
            {
                return e;
            }

            LambdaExpression lambda = Expression.Lambda(e);
            Delegate fn = lambda.Compile();

            return Expression.Constant(fn.DynamicInvoke(null), e.Type);
        }
    }

    class Nominator : ExpressionVisitor 
    {
        Func<Expression, bool> fnCanBeEvaluated;
        HashSet<Expression> candidates;
        bool cannotBeEvaluated;

        internal Nominator(Func<Expression, bool> fnCanBeEvaluated) 
        {
            this.fnCanBeEvaluated = fnCanBeEvaluated;
        }

        internal HashSet<Expression> Nominate(Expression expression) 
        {
            this.candidates = new HashSet<Expression>();
            this.Visit(expression);
            return this.candidates;
        }

        protected override Expression Visit(Expression expression) 
        {
            if (expression != null) 
            {
                bool saveCannotBeEvaluated = this.cannotBeEvaluated;
                this.cannotBeEvaluated = false;
                base.Visit(expression);

                if (!this.cannotBeEvaluated) 
                {
                    if (this.fnCanBeEvaluated(expression)) 
                    {
                        this.candidates.Add(expression);
                    }
                    else 
                    {
                        this.cannotBeEvaluated = true;
                    }
                }

                this.cannotBeEvaluated |= saveCannotBeEvaluated;
            }

            return expression;
        }
    }
} 
例如,如果我有以下表达式:

string ct = "London";
var query = db.Customers.Where(c => c.City == ct);
翻译后返回的表达式将是:

从客户处选择*FROM SELECT*作为T,其中城市='伦敦' 除了DateTime之外,所有类型的变量代码都正常工作。 在我的数据库中,我只保存没有时间的日期部分,例如2012年3月2日

现在如果我有这个问题:

DateTime dt1 = Convert.ToDateTime("01/01/2012");
var query = db.Orders.Where(c => c.dt == dt1);
如果我尝试翻译,返回的表达式是:

从订单中选择*从订单中选择*作为T,其中dt='01/01/2012 12:00:00 AM' 正如您所看到的,转换后的查询包含末尾的时间,而my query everytime不返回任何记录


我能做什么?

数据库中列的类型是什么?这是因为DateTime由日期和TimeDateTime dt1=01/01/2012组成;不编译。请发布真实代码。在我的sql server数据库中,列的类型是DATE如果您的列是sql server上的日期列,而不是DATETIME列,我会感到惊讶的是,从订单中选择*FROM SELECT*FROM Orders AS T,其中dt='01/01/2012 12:00:00 AM'不会返回任何内容,假设该日期至少有一行我尝试了几种方法,但问题似乎不是保存日期的变量如何格式化,而是它以后如何翻译。
var query = db.Orders.Where(c => c.dt == dt1.ToString("MM/dd/yyyy"));
var query = db.Orders.Where(c => c.dt == dt1.ToString("MM/dd/yyyy"));