2012-04-03 5 views
9

Estoy intentando devolver el resultado de una consulta de entidad de marco en mi propia clase dto, al mismo tiempo que mapeando mi enum TradeType.Enum de mapeo de marco de entidad: el valor especificado no es una instancia del tipo 'Edm.Int32' Nombre del parámetro: valor

estoy consiguiendo el error siguiente

El valor especificado no es una instancia de tipo Nombre del parámetro 'Edm.Int32': valor

alguna idea de cómo solucionarlo o una solución?

Gracias

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; } 
} 

Respuesta

10

enumeraciones en las proyecciones de las proyecciones de Entity Framework (Select) es un problema de conocimiento. Si lo hace

_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 ... 

la proyección se realiza por medio de linq-to-objects, que es un trabajo de rutina.


EDITAR

Como último momento a finales Me gustaría añadir que sólo un tonto ToList() puede ser perjudicial cuando la tabla en cuestión tiene muchas columnas. Significaría que se transfieren muchos más datos al cliente de lo necesario. En tales casos, puede ser útil hacer una proyección doble . Primero, dentro del alcance del proyecto del proveedor de consultas para los tipos aceptados. Entonces, después de cambiar al proyecto LINQ a objetos (AsEnumerable) al último tipo:

_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 
       }). 
+0

Gracias, solucioné el problema cambiando mi dto para tener una variable interna que almacenaba la versión de texto original de PriceTypeCode y expuse una propiedad pública que realiza un cambio para devolver la enumeración correcta. ¡Un poco hacky pero dio los resultados deseados! :). Saludos por tus respuestas, usaré tu método en el futuro. – Mantisimo

+0

Gracias, esto me ayudó a resolver mi problema, cambié mi código a ToString() la enumeración en una variable local fuera de la consulta y eso lo resolvió para mí. – John

+0

Hola @John. Su comentario llamó mi atención sobre este post nuevamente y me instó a agregar una idea de último momento. –

8

Instalación de .Net 4.5 parece solucionar el problema, así (su proyecto puede aún estar en el 4.0).

Estaba teniendo este problema en nuestro servidor de ensayo (los servidores de desarrollo y prueba funcionaban bien) y descubrí que no tenía .Net 4.5 instalado. Una vez que instalé 4.5, el problema se solucionó sin ningún cambio de código.

+1

Esto es correcto y según pasa el tiempo esto se convertirá en _la_ respuesta a esta pregunta. –

+0

¿Cómo resuelve esto el problema en las máquinas con Windows XP? – TheButlerDidIt

+0

@BitOriented ¿Está argumentando que una corrección de errores en la nueva versión de .Net es una solución menos preferible para implementar sus propias soluciones porque un entorno antiguo, no compatible y sin servidor no puede implementarlo? –

Cuestiones relacionadas