【问题标题】:How to compare a string column to a number (as a decimal) in Linq如何在 Linq 中将字符串列与数字(作为小数)进行比较
【发布时间】:2011-10-19 22:09:16
【问题描述】:

我有一个带有金额字段的数据库 - 它是一个小数,尽管数据库架构将列定义为字符串。我希望能够运行 Linq 查询以根据金额的数字查找值。

thisthis 这样的问题讨论了使用CompareTo 方法,但在这种情况下不起作用。例如,我在数据库中有以下账单金额:

556
130
1450
410

以下代码:

from t in test
where t.BillAmount.CompareTo("50") > 0
select t

将返回值556,但不会返回任何其他值,即使它们都高于十进制值 50。

将 where 行改为:

    where t.BillAmount.CompareTo("50") < 0

将返回 13014501450,因为它们“小于”然后 50 作为字符串,而不是作为数字。

我没有使用实体框架,所以我不能这样做:

where SqlFunctions.StringConvert((double)t.BillAmount).Trim() > 50

我也无法控制数据库架构,因此无法更改这些值。如何将 BillAmount 字段与数字进行比较并返回其上方/下方的值?

【问题讨论】:

  • 也许 Convert.ToDecimal() 会有所帮助? Select(s => Convert.ToDecimal(s))
  • 你说你不使用EF,那么测试的类型是什么?数据表?

标签: c# .net linq compareto


【解决方案1】:

您不必使用实体框架将字符串转换为十进制。

您可以简单地使用Convert 调用。

var x = from t in test 
        where Convert.ToDecimal(t.BillAmount) > 50 
        select t

或使用 Lambda 表达式:

var x = test.where(p=>Convert.ToDecimal(p.BillAmount) > 50);

【讨论】:

    【解决方案2】:

    这是使用let 的好地方,它可以让您拥有一个临时变量作为 LINQ 查询的一部分。像这样的东西应该可以工作:

    from t in test
    let amount = Convert.ToDecimal(t.BillAmount)
    where amount > 50
    select t
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-17
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 2010-12-04
      • 2016-01-16
      相关资源
      最近更新 更多