Entity Framework / Linq EXpression conversión de cadena a int

Tengo una Expresión como esa:

var values = Enumerable.Range(1,2); return message => message.Properties.Any( p => p.Key == name && int.Parse(p.Value) >= values[0] && int.Parse(p.Value) <= values[1]); 

Esto comstack bien, pero cuando llega a la base de datos lanza la excepción 'LINQ to Entities does not recognize the method 'Int32 Parse(System.String)' method, and this method cannot be translated into a store expression '

Si no hago el análisis sintáctico y los valores son una string[] no puedo usar los operadores >= y <= en las cadenas.

p.Value es una cadena que contiene varios valores, pero en este caso es int

¿Hay alguna manera de consultar la base de datos para hacer este tipo de statement entre?

Como señalaron otros en los comentarios, el hecho de que tenga que analizar este valor debería ser una señal de advertencia de que debe usar un tipo de datos diferente en su base de datos.

Afortunadamente, hay una solución al forzar que LINQ ejecute la consulta en Objects en lugar de LINQ to Entities. Desafortunadamente, significa potencialmente leer una gran cantidad de datos en la memoria

EDITAR

En base a sus otros comentarios, el valor en la columna Valor no garantiza ser un número. Por lo tanto, deberá intentar convertir el valor en un número y luego manejar las cosas en función de la falla o el éxito de esa conversión:

 return message .Properties .AsEnumerable() .Any(p => { var val = 0; if(int.TryParse(p.Value, out val)) { return p.Key == name && val >= values[0] && val <= values[1]) } else { return false; } ); 

EDIT 2

En realidad, puede salirse con la suya en la base de datos. No estoy seguro de si esto funcionará o no para ti, pero dale una oportunidad:

 return message.Properties .Where(p => p.Key == name && SqlFunctions.IsNumeric(p.Value) > 0) .Any(p => Convert.ToInt32(p.Value) >= values[0] && Convert.ToInt32(p.Value) <= values[1]); 

Por mucho que odie esta respuesta. La respuesta real es que no puedes hacerlo fácilmente. Será un verdadero dolor He visto muchas respuestas incorrectas y muchas respuestas con personas que dicen que, para empezar, los campos de la base de datos deben ser del tipo correcto. no es útil.

Esta pregunta es similar a http://social.msdn.microsoft.com/Forums/en-US/ce9652e3-5450-44c4-a9bd-586b4c4e6a27/convert-string-to-int-in-whereorderby-is-it-possible ? forum = adodotnetentityframework

Hay varias posibilidades dependiendo del tipo de EF que esté usando.

1. Usted está usando archivos EDMX.

(No código primero o código de ingeniería inversa primero). Puede usar algo como ( LINQ to Entities no reconoce el método ‘Double Parse (System.String)’, y este método no se puede traducir a una expresión de tienda )

  [EdmFunction("PlusDomain", "ParseDouble")] public static double ParseDouble(string stringvalue) { /// This method exists for use in LINQ queries, /// as a stub that will be converted to a SQL CAST statement. return System.Double.Parse(stringvalue); } 

y mapa en tu EDMX

 >  >  >  > cast(stringvalue as Edm.Double) >  >  

2. Si está utilizando el código primero en EF> = 4.1.

Estás jodido. Microsoft no consideró apropiado agregar ninguna función a SqlFunctions. Lo mejor que puede esperar es agregar una función SQL escalar en su base de datos y (tal vez) tratar de asignarla a su contexto. Microsoft no veía ningún punto para hacer algo como esto en el código primero. Afortunadamente, tampoco bloquearon totalmente estas cosas. La API Fluent es poderosa.

Será algo como esto:

Puede llamar a las funciones o procedimientos almacenados de esta manera: defina primero la función escalar con el código ef4.1? o http://weblogs.asp.net/dwahlin/using-entity-framework-code-first-with-stored-procedures-that-have-output-parameters como:

var outParam = new SqlParameter (“overHours”, SqlDbType.Int); outParam.Direction = ParameterDirection.Output;

var data = context.Database.ExecuteSqlCommand (“dbo.sp_getNumberJobs @overHours OUT”, outParam); int numJobs = (int) outParam.Value;

pero para que realmente se integren en LinQ a las entidades necesitas algo más como esto:

https://codefirstfunctions.codeplex.com/ utilizando http://www.nuget.org/packages/EntityFramework.CodeFirstStoreFunctions mapea las funciones de SQL en el contexto pero esto usa una biblioteca externa solo creada para .NET 4.5 http: // blog.3d-logic.com/2014/04/09/support-for-store-functions-tvfs-and-stored-procs-in-entity-framework-6-1/

o puede intentar hacer lo mismo manualmente con algo como:

Entity Framework 6 Code Primer mapeo de función o

https://entityframework.codeplex.com/discussions/494365

o la solución más rápida que he decidido para mis necesidades es simplemente crear una vista con los tipos convertidos. Esto evita todo el problema.

Recientemente tuve que convertir una cadena (representación numérica) en un valor de enumeración en una consulta LINQ, sin materializar la consulta. Mi enumeración usó valores int entre 0 y 9, así que terminé haciendo algo como esto:

  .Select(str => (MyEnum?)(SqlFunctions.Unicode(str) - 48)) 

Sé que esto no proporciona una solución completa para el problema, pero definitivamente funciona en una situación como la mía. Quizás algunos lo encuentren útil.

Puede intentar Convert.ToInt32(input); Si no está seguro, puede TryParse . No arrojará una excepción, pero falso no puede Parse. Pero Convert.ToInt32(input); Deberia trabajar. Puede leer sobre esto en http://msdn.microsoft.com/en-us/library/vstudio/bb397679.aspx .