【问题标题】:How to convert a string to decimal within an IQueryable如何在 IQueryable 中将字符串转换为十进制
【发布时间】:2018-05-21 02:00:57
【问题描述】:

嗯,这听起来比它更容易!我有一个表,其中包含存储为字符串值的金额。但是我的代码需要它们作为十进制值,并且需要将它们转换为十进制,作为 IQueryable 正在进行的查询的一部分!因此,无法使用 .ToList() 。转换需要由其背后的数据库完成。
此 IQueryable 基本上是 IQueryables 链的一部分,因此下一个查询可能希望在此数量上添加过滤器以进行较小的选择,或者对数量进行其他类型的数学运算。进入的查询可能已经是所有数据的子选择。
编辑:让我解释一下我在这里的工作:我有类似这种方法的东西要写:

public static IQueryable<PriceList> GetPriceList(this IQueryable<PriceData> query) => query.Select(d => new PriceList{Name = d.Item.Name, Price = decimal.Parse(d.Value)}).AsQueryable();

PriceData 是一个包含一些字段和价格作为字符串值的记录。但是价格表记录需要它们为十进制。
然后,此方法可以被另一种扩展方法用于进一步的选择、数学等。只是 decimal.parse 和其他选项在 IQueryable 中不起作用...

【问题讨论】:

  • dbContext.someTable.SqlQuery("SELECT CONVERT(amount, DECIMAL) FROM someTable").AsIQueryable() 怎么样?
  • 要是我能做到就好了。但不是。我得到一个 IQueryable 作为输入,并且必须踢出一个 IQueryable 作为输出,因为它是更大的表达式树的一部分......
  • 为什么价格首先是一个字符串?这似乎是错误的。 (可能应该是金钱,十进制)。也就是说,可能stackoverflow.com/questions/12118258/…的副本
  • 是的,我知道。这是错误的,我无法控制它。它只是表达式链的一部分。
  • 至于重复?不,因为另一个问题已经超过 5 年了,因为那里的答案建议使用 .ToList()。我不能使用它,因为这意味着 IQueryable 失去了与数据库的链接,并将实际执行查询。在我的情况下这是不允许的!

标签: c# entity-framework-6 iqueryable


【解决方案1】:

如前所述,不支持您尝试执行的操作。

  • 最好的办法是将数据库字段类型更改为它实际代表的类型:货币/小数
  • 如果无法做到这一点,请与有能力做到这一点的人交谈

如果不可能,我能想到的最接近的解决方法是:

public class PriceList
{
    public string Price { get; set; }
    public decimal ParsedPrice => decimal.Parse(Price);
}

然后:

.Select(d=>new PriceList
{
    Price = d.Price
});

但是,您无法在 ParsedPrice 上执行任何 DbOperations。另请注意,您不能在 EF6 中使用带有参数的构造函数。那将是您遇到的下一个问题。

EF 最适合 CRUD。对于更多的事情,你可能应该有一个服务,它只获取你需要的数据,实现它们并从中创建一个 DTO 或 Businessobject。

类似的东西:

public class MyService
{
    public IEnumerable<PriceList> GetPriceList(Expression<Func<MyEntity, bool>> predicate)
    {
        var data = _context.MyEntity.Where(predicate).ToList();
        foreach (var item in data)
        {
            var dto = new PriceList {...}
            yield return dto;
        }        
    }
}

【讨论】:

  • 是的,这很烦人,因为 EF 确实有可以将数值转换为字符串的 SqlFunctions 静态类。那么为什么没有类似的东西可以在另一个方向转换呢?我发现docs.microsoft.com/en-us/dotnet/framework/data/adonet/ef/… 没有列出任何字符串到数字的转换,所以它似乎是不可能的。现在……
  • 可能是因为每个 int 都可以是字符串,但不是每个字符串都可以是 int。但我不想做任何假设,我不是 100% 确定。
  • 是的,但如果转换失败,您可以返回 NAN 作为结果。或者一个异常,因为许多数据库同样容易返回错误。但是 DBFunctions 和 SqlFunctions 似乎都表明应该可以将 C# 函数映射到它们的 SQL 对应项。再说一次,将字符串转换为数字的需求往往被认为是设计缺陷。一个我无法在当前系统中修复。
猜你喜欢
  • 2013-02-07
  • 2011-08-25
  • 2014-04-28
  • 1970-01-01
  • 2018-08-31
  • 2022-07-22
  • 1970-01-01
  • 2015-02-06
  • 1970-01-01
相关资源
最近更新 更多