【问题标题】:Lambda expression Compare operator ">",">=" issueLambda 表达式比较运算符 ">",">=" 问题
【发布时间】:2012-09-12 14:39:32
【问题描述】:

当我在实体框架中执行这些操作符(>>=) lambda 表达式时。两者都得到相同的结果。

  1. db.Companies.where(Company => (Compare(Convert(Company.Name), "y") > 0))
  2. db.Companies.where(Company => (Compare(Convert(Company.Name), "y") >= 0))

这是 Lambda 表达式比较运算符的问题吗? 我改成

  1. db.Companies.where(Company => (Compare(Convert(Company.Name), "y") > 1)) - 没有结果。它不正确

  2. db.Companies.where(Company => (Compare(Convert(Company.Name), "y") >= 1)) - 64 个结果

源代码

case operatorType.Greater: return Expression.GreaterThan(Expression.Call(typeof(string),
                            "Compare", null, new[] { argLeft, argRight }),
                             Expression.Constant(1, typeof(int)));

case operatorType.GreaterEqual: return Expression.GreaterThanOrEqual(       Expression.Call(typeof(string), "Compare", null, new[]  { argLeft, argRight }),
                        Expression.Constant(1, typeof(int)));

【问题讨论】:

  • ConvertCompare 是什么?
  • 好吧,没有看到他们,我们无法判断他们应该评估什么。
  • -1 个不完整的问题!如何转换和比较 do..
  • 转换我用于使用 FieldType 进行类型转换。

标签: c# lambda


【解决方案1】:

如果你得到相同的结果,意味着没有Company.Name等于“Y”

【讨论】:

  • db.Companies.where(Company => (Compare(Convert(Company.Name), "y") > 0)) 给出了 64 个结果。 db.Companies.where(Company => (Compare(Convert(Company.Name), "y") >= 0)) 也给出了 64 个结果
  • 您应该向我们展示 Comapare/Convert 的作用。但是如果 Compare 与 String.Compare 的工作方式相同,如果结果 > 0 则表示公司名称与“Y”不同。因此,您的 where 将返回所有与“Y”不同的名称
  • 如果第一个操作数大于第二个操作数,string.compare 将返回大于零的值。两者不相等会是非零。
  • 当然。所以,如果你使用 > 0,将返回任何大于 0 的值。如果你使用 >= 0,你将得到任何大于或等于 0 的值。因此,如果您得到相同的结果,则意味着没有 0,因此没有 Company.Name 等于“Y”(您的比较)
  • @ElVieejo 是的。您的答案文本是正确的(假设 CompareConvert 做您认为他们做的事情)但您的评论不正确。 "if the result is > 0 means that the company names are different to "Y". So, your where is returning all your names different to "Y""。所有与“y”不同的公司名称都是(Compare(Convert(Company.Name), "y") != 0)
【解决方案2】:

为什么你会期望答案不同。

  • Compare 有什么作用?
  • Convert 有什么作用?
  • Compare(Convert(Company.Name), "y") 的计算结果是什么?

如果计算结果为 1 或更高,则两个答案都是正确的。

【讨论】:

  • 两者都是“会是真的”,而不是“会是正确的” 因为我们不知道要求我们不知道“正确”应该是什么。它们也可能导致任何小于 0 的结果并且相同。只有当 compare 有时返回 0 时,它们才会有所不同。
  • 好吧,我这么说是因为查看代码,并且对未显示的方法做了一些假设,我的猜测都不是正确的。他可能应该使用!=,而不是大于或大于或等于。
  • 我试过这个 db.Companies.where(Company => (Compare(Convert(Company.Name), "y") > 1)) - 没有结果 db.Companies.where(Company => (Compare(Convert(Company.Name), "y") >= 1)) -64 结果--my query expressions code for greaterthanEqual : case operatorType.GreaterEqual: return Expression.GreaterThanOrEqual(Expression.Call(typeof(string), "比较", null, new[] { argLeft, argRight }), Expression.Constant(1, typeof(int)));
【解决方案3】:

如果两个查询的结果数量相同,则意味着(Compare(Convert(Company.Name), "y") 永远不会等于零。如果它大于零,则两个查询都将返回它;如果它小于零,那么两个查询都不会返回它。

【讨论】:

    【解决方案4】:

    感谢所有回复 Lambda 表达式查询仅是正确的。

    db.Companies.where(Company => (Compare(Convert(Company.Name), "Test") > 0))
    db.Companies.where(Company => (Compare(Convert(Company.Name), "Test") >= 0))
    

    我将“right arg”值更改为“Test”。我有一个记录'名称'与测试。执行以下查询。

    db.Companies.where(Company => (Compare(Convert(Company.Name), "Test") > 0)) 
    

    并显示结果 105(此处未显示带有“测试”的名称。-正确

    然后我执行了这个

    db.Companies.where(Company => (Compare(Convert(Company.Name), "Test") >= 0)) 
    

    并显示结果 106(此处显示带有“测试”的名称)-正确

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-16
      • 2021-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-27
      • 1970-01-01
      相关资源
      最近更新 更多