实体框架映射枚举:指定的值不是'Edm.Int32'类型的实例参数名称:value

Man*_*imo 9 enums expression entity-framework entity-framework-4

我试图将实体框架查询的结果返回到我自己的dto类中,同时映射我的枚举TradeType.

我收到以下错误

指定的值不是'Edm.Int32'类型的实例参数名称:value

知道如何修复或解决方法吗?

谢谢

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; }
}
Run Code Online (Sandbox Code Playgroud)

Ger*_*old 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 ...
Run Code Online (Sandbox Code Playgroud)

投影是由常规的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
                 }).
Run Code Online (Sandbox Code Playgroud)


Bra*_*ord 9

安装.Net 4.5似乎也解决了这个问题(您的项目仍然可以在4.0上).

我在我们的登台服务器上遇到此问题(开发和测试服务器工作正常)并发现它没有安装.Net 4.5.一旦我安装了4.5,问题就会在没有任何代码更改的情况下清除.