如何在 IQueryable 中将字符串转换为十进制

How to convert a string to decimal within an IQueryable

好吧,这听起来比实际更容易!我有一个 table,其中包含存储为字符串值的金额。但是我的代码需要它们作为十进制值,并且需要将它们转换为十进制作为 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 是一个记录,包含一些字段和作为字符串值的价格。但是 PriceList 记录需要它们作为十进制。
然后,该方法可以被另一种扩展方法用于进一步的选择、数学等等。只是 decimal.parse 和其他选项在 IQueryable 中不起作用...

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

  • 最好的办法是将数据库字段类型更改为它实际代表的类型:Money/Decimal
  • 如果那不可能,请与有能力使之成为可能的人交谈

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

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;
        }        
    }
}