【问题标题】:c# How to evaluate compareTo(..) in Expression which returns a stringc# 如何在返回字符串的表达式中评估 compareTo(..)
【发布时间】:2018-02-23 18:25:45
【问题描述】:

我也有类似的情况:How to declare a Linq Expression variable in order to have it processed as a dbParameter

但就我而言,不想与“等于”运算符进行比较,我需要将一个字符串与另一个字符串进行比较。我怎样才能做到这一点?

我尝试过这样的事情:

    var comparsionString = "aaa";
    ParameterExpression param = Expression.Parameter(typeof(ItemSearch), "s");
    Expression prop = Expression.Property(param, "Id");
    Expression<Func<string>> idLambda = () => comparsionString;
    Expression searchExpr = Expression.GreaterThanOrEqual(prop, idLambda.Body);

    Expression<Func<ItemSearch, bool>> myLambda =
        Expression.Lambda<Func<ItemSearch, bool>>(searchExpr, param);

但不幸的是,字符串不支持 GreaterThanOrEqual。所以我需要至少由 SQL to Entities 支持的 string.CompareTo(..) 方法。

说:

Expression searchExpr = Expression.IsTrue(*prop*.CompareTo(*idLambda*) >= 0);

如何以编译器可以理解的方式编写?

感谢任何帮助。 谢谢!

【问题讨论】:

  • 这个答案有帮助吗? stackoverflow.com/a/24890249/4222487
  • 您可以使用 LINQPad 将您初始化的Expression 变量输出为类似于所需输出的内容,然后编写代码重新创建它。 idLambda 很好用,但Expression.Constant 可能更好。

标签: c# linq lambda linq-expressions


【解决方案1】:

如果你调查编译器翻译

Expression<Func<string, bool>> f = s => s.CompareTo("aaaa") >= 0;

你会发现你需要使用 GreaterThanOrEqual(Call("s", "CompareTo", "aaaa")) 所以创建的代码是:

var comparsionString = "aaa";
ParameterExpression param = Expression.Parameter(typeof(ItemSearch), "s");
Expression prop = Expression.Property(param, "Id");
Expression<Func<string>> idLambda = () => comparsionString;
var CallMethod = typeof(string).GetMethod("CompareTo", new[] { typeof(string) });
Expression callExpr = Expression.Call(prop, CallMethod, idLambda.Body);
Expression searchExpr = Expression.GreaterThanOrEqual(callExpr, Expression.Constant(0));

Expression<Func<ItemSearch, bool>> myLambda =
    Expression.Lambda<Func<ItemSearch, bool>>(searchExpr, param);

【讨论】:

  • 天才!作为一种魅力:只有一个改进:nameof(string.CompareTo) 而不是“CompareTo”;)
  • 我不确定这是一种改进吗? nameof(String.CompareTo) 的结果将是“CompareTo”。
  • 好吧,不要称之为改进,它只是轻量级的化妆品;)
  • @user1470240 编程时我们都有自己的怪癖:)
猜你喜欢
  • 1970-01-01
  • 2011-08-03
  • 1970-01-01
  • 2016-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-20
  • 2012-05-29
相关资源
最近更新 更多