如何在 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;
}
}
}
好吧,这听起来比实际更容易!我有一个 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;
}
}
}