问题
I'm trying to return the result of a entity framework query into my own dto class, at the same time as mapping my enum TradeType.
I'm getting the following error
The specified value is not an instance of type 'Edm.Int32' Parameter name: value
Any idea how to fix or a workaround?
Thanks
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; }
}
回答1:
Enums in projections from Entity Framework projections (Select
) is a know issue. If you do
_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 ...
the projection is done by regular linq-to-objects, which is a routine job.
EDIT
As a late afterthought I'd like to add that just a dumb ToList()
can be detrimental when the table in question has many columns. It would mean that far more data is transferred to the client than necessary. In such cases it can be useful to do a double projection. First, within the scope of the query provider project to accepted types. Then, after switching to linq-to-objects (AsEnumerable
) project to the final type:
_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
}).
回答2:
Installing .Net 4.5 appears to fix the issue as well (your project can still be on 4.0).
I was having this issue on our staging server (dev and test servers worked fine) and discovered that it did not have .Net 4.5 installed. Once I installed 4.5, the issue cleared up without any code changes.
回答3:
I got this error when trying to update entities, I'm adding this answer because this question is the top result when searching for that eerror. For updating, it is due to a bug in MySQL Connector:
https://bugs.mysql.com/bug.php?id=44801
It appears to affect version 6.0.3 and below:
See the release notes for 6.0.3 MySQL Connector for .Net
It informs that the unsigned int are not supported for EF int this version.
The easiest fix (for me) was to change the column to be signed instead of unsigned.
来源:https://stackoverflow.com/questions/9990196/entity-framework-mapping-enum-the-specified-value-is-not-an-instance-of-type