C# Linq查询:转换局部变量引用
我需要将linq查询中的局部变量引用转换为其值。 为此,我使用该类在查询中执行translate局部变量引用: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
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"));