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

时间:2017-12-07 03:11:46

标签: c# entity-framework-6 iqueryable

嗯,听起来比这更容易!我有一个表包含存储为字符串值的数量。但是我的代码需要它们作为十进制值,它需要将它们作为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中不起作用......

1 个答案:

答案 0 :(得分:1)

正如已经评论过的那样,不支持您尝试做的事情。

  • 您最好的办法是将数据库字段类型更改为其实际代表的内容: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;
        }        
    }
}