Recibo esta excepción:
El miembro de tipo especificado 'Pagado' no es compatible con LINQ to Entities. Solo se admiten inicializadores, miembros de entidad y propiedades de navegación de entidad.
public ActionResult Index()
{
var debts = storeDB.Orders
.Where(o => o.Paid == false)
.OrderByDescending(o => o.DateCreated);
return View(debts);
}
Mi clase de modelo
public partial class Order
{
public bool Paid {
get {
return TotalPaid >= Total;
}
}
public decimal TotalPaid {
get {
return Payments.Sum(p => p.Amount);
}
}
Pagos es una tabla relacionada que contiene el monto del campo. La consulta funciona si elimino la cláusula Where que muestra la información correcta sobre los pagos, ¿alguna pista de lo que está mal con el código?
Resuelto como la respuesta sugerida con:
public ActionResult Index()
{
var debts = storeDB.Orders
.OrderByDescending(o => o.DateCreated)
.ToList()
.Where(o => o.Paid == false);
return View(debts);
}
linq
entity-framework
Bagazo
fuente
fuente
Respuestas:
La entidad está intentando convertir su propiedad Paid a SQL y no puede porque no forma parte del esquema de la tabla.
Lo que puede hacer es dejar que la entidad consulte la tabla sin filtro de pago y luego filtrar los que no son de pago.
Eso, por supuesto, significaría que traerá todos los datos al servidor web y los filtrará. Si desea filtrar en el servidor de base de datos, puede crear una columna calculada en la tabla o utilizar un procedimiento almacenado.
fuente
Solo tenía que resolver un problema similar. Las soluciones anteriores requieren procesamiento en memoria, lo cual es una mala práctica (carga diferida).
Mi solución fue escribir un ayudante que devolviera un predicado:
Puede reescribir su declaración de linq como:
Esto es útil cuando desea reutilizar la lógica de cálculo (DRY). La desventaja es que la lógica no está en su modelo de dominio.
fuente
Expression<Func<xx,yy>>
. Lo había entendido antes, pero ahora parece obvio.Este problema también puede provenir de una
[NotMapped]
propiedad que tiene el mismo nombre en su modelo de base de datos y modelo de vista.AutoMapper intenta seleccionarlo del DB durante una proyección; y la propiedad NotMapped obviamente no existe en la base de datos.
La solución es
Ignore
la propiedad en la configuración de AutoMapper al mapear desde el modelo de base de datos al modelo de vista.[NotMapped]
propiedad con nombreFoo
en su modelo de base de datos.Foo
, en su Modelo de vista..ForMember(a => a.Foo, b => b.Ignore());
fuente
Ahora, esta conversión solo ocurre para miembros de entidades, inicializadores y propiedades de navegación de entidades. Entonces, para lograr la función u obtener la comparación de propiedades, primero debemos convertirlos en un listado en memoria y luego aplicar la función para recuperar datos.
Por lo tanto, en totalidad,
fuente
La otra razón probable es que está utilizando
IEnumerable
para su propiedad, en lugar deICollection
Entonces en lugar de:
Hacer esto:
Y estás buenísimo ... es una estupidez perder 2 horas.
fuente
Esta situación también puede suceder si está utilizando tipos EntityFramework no admitidos , como unsigned int.
Este fue mi caso de tal error.
Consulte más información sobre los tipos admitidos: https://msdn.microsoft.com/en-us/library/ee382832(v=vs.100).aspx
Existe una solución para tales situaciones, explicada por GFoley83: ¿Cómo usar tipos int / long sin firmar con Entity Framework?
fuente
Me enfrenté a este problema porque tenía una variable miembro con solo
get
without set
propiedadeso significa su
auto calculated
ynot stored
como una columna enthe table
por lo tanto está
not exist
en eltable schema
fuente
su edmx y el modelo de contexto tienen alguna propiedad diferente que se agregó recientemente a db.
Actualice su EDMX, actualícelo correctamente. Edite su proyecto y vuelva a ejecutarlo.
Resolverá tu problema.
Saludos, Ganesh Nikam
fuente