c# - oraciones - LINQ to Entities no reconoce el método ''Int32 Parse(System.String)'' al intentar analizar una columna para comparaciones de desigualdad
oraciones de inferioridad (5)
Tengo el siguiente código en mi página:
var myVar= Entity.SetName
.Where(p => int.Parse(p.ID) >= start &&
int.Parse(p.ID) <= end);
start y end son int, pero p.ID es una cadena. Así que debería convertir p.ID a int. Pero me sale el siguiente error:
LINQ to Entities no reconoce el método ''Int32 Parse (System.String)'', y este método no se puede traducir a una expresión de tienda.
¿¿Dónde está el problema??
Aunque no es eficiente, debería poder cargar todas las filas y luego usar LINQ para objetos:
var myVar= Entity.SetName.ToList()
.Where(p => int.Parse(p.ID) >= start &&
int.Parse(p.ID) <= end);
Mueve la función de análisis fuera de la expresión linq.
int id = int.Parse(p.ID);
var myVar= Entity.SetName
.Where(p => id >= start && int.Parse(p.ID) <= end);
Primero intenta convertir a int
luego pasa el nombre de esa variable
int catgry = Convert.ToInt32(customercategory.OWNERSHIP_TYPE);
var customerCateg = (from d in _db.tbl_SIL_CUSTOMER_CATEGORY_MST
.Where(d => d.CAT_ID == catgry) select d.CAT_TYPE).SingleOrDefault();
En primer lugar, recomendaría encarecidamente que verifique el diseño de su base de datos, si existe una buena razón para que la ID
sea una string
. Consideraría cambiar el tipo de ID
DB a int
y se librará de este problema con la conversión .
El error que recibe significa que EF no sabe cómo convertir el método Int32.Parse()
a SQL. Básicamente tienes dos opciones de cómo lidiar con eso:
Hacer la comparación fuera de linq a entidades:
var myVar= Entity.SetName.AsEnumerable()
.Where(p => int.Parse(p.ID) >= start &&
int.Parse(p.ID) <= end);
Pero esto no se recomienda , porque está leyendo el conjunto completo de resultados de DB, antes de aplicar la condición where
.
O haga que el modelo personalizado defina la función como se describe en esta publicación en SO:
Convierta la cadena a Int en EF 4.0 o Entity Framework: ¿Dónde extiendo el CSDL / MSL?
private void LoadDetail(int id)
{
var sp = from category in db.ProductCategories
join product in db.Products on category.ProductCategoryID equals product.ProductCategoryID
where id == int.Parse(category.ProductCategoryID)
select new
{
product.ProductID,
product.ProductName,
product.ProductCode,
product.Deception,
category.CategoryName,
product.Quanrity,
product.Price
};
DGVDetail.DataSource = sp.ToList();//help: Error: LINQ to Entities does not recognize the method ''Int32 Parse(System.String)'' method, and this method cannot be translated into a store expression
}
private void DGVMaster_CellClick(object sender, DataGridViewCellEventArgs e)
{
int index = e.RowIndex;
LoadDetail(index + 1);
}