我正在尝试将实体框架查询的结果返回到我自己的dto类中,同时映射我的枚举TradeType。
我收到以下错误
指定的值不是'Edm.Int32'类型的实例参数名称:值
知道如何修复或解决方法吗?
由于
public IEnumerable<Trade> GetLiveTrades(string routeName)
{
return _entities.Price.Where(p => p.StatusCode.Equals("A") && p.Period.PeriodYear <= DateTime.Now.Year+1 && p.Route.RouteCode.Equals(routeName)).
Select(p => new Trade
{
Volume = (long) (p.Volume ?? 100),
TradeType = (p.PriceTypeCode.Equals("O") ? TradeType.Seller : TradeType.Bidder),
Price = p.Price1,
TenorStartDate = p.Period.PeriodStartDate.Value,
TenorEndDate = p.Period.PeriodStartDate.Value,
TradeId = p.ID
}).ToList();
}
public class Trade
{
public long Volume { get; set; }
public TradeType TradeType { get; set; }
public double Price { get; set; }
public DateTime TenorStartDate { get; set; }
public DateTime TenorEndDate { get; set; }
public Guid TradeId { get; set; }
}
答案 0 :(得分:10)
来自实体框架预测(Select
)的预测中的枚举是一个已知问题。如果你这样做
_entities.Price.Where(p => p.StatusCode.Equals("A") &&
p.Period.PeriodYear <= DateTime.Now.Year + 1 &&
p.Route.RouteCode.Equals(routeName)).ToList() // ToList !
.Select(p => new Trade ...
投影是通过常规的linq-to-objects完成的,这是一项例行工作。
修改强>
作为一个迟到的事后,我想补充说,当有问题的表有很多列时,只有一个愚蠢的ToList()
可能是有害的。这意味着将更多数据传输到客户端而不是必要的数据。在这种情况下,进行双重投影会很有用。首先,在查询提供者项目范围内接受类型。然后,在切换到linq-to-objects(AsEnumerable
)项目后转换为最终类型:
_entities.Price.Where(p => p.StatusCode.Equals("A") &&
p.Period.PeriodYear <= DateTime.Now.Year + 1 &&
p.Route.RouteCode.Equals(routeName))
.Select(p => new
{
Volume = (long) (p.Volume ?? 100),
PriceTypeCode = p.PriceTypeCode,
Price = p.Price1,
TenorStartDate = p.Period.PeriodStartDate.Value,
TenorEndDate = p.Period.PeriodStartDate.Value,
TradeId = p.ID
})
.AsEnumerable()
.Select(x => new Trade
{
Volume = x.Volume,
TradeType = (x.PriceTypeCode.Equals("O") ? TradeType.Seller : TradeType.Bidder),
Price = x.Price1,
TenorStartDate = x.TenorStartDate,
TenorEndDate = x.TenorEndDate,
TradeId = x.ID
}).
答案 1 :(得分:9)
安装.Net 4.5似乎也解决了这个问题(你的项目仍然可以在4.0上)。
我在我们的登台服务器上遇到此问题(开发和测试服务器工作正常)并发现它没有安装.Net 4.5。一旦我安装了4.5,问题就会在没有任何代码更改的情况下解决。
答案 2 :(得分:0)
尝试更新实体时出现此错误,我添加了此答案,因为此问题是搜索该错误时的最高结果。对于更新,这是由于MySQL连接器中的错误引起的:
https://bugs.mysql.com/bug.php?id=44801
它似乎影响6.0.3及更低版本:
请参阅适用于.Net的6.0.3 MySQL连接器的发行说明
它通知EF int不支持unsigned int 版本。
(对我来说)最简单的解决方法是将要更改的列更改为未签名的列。