update tutorial net mvc framework first espaƱol code asp c# asp.net-mvc linq entity-framework

tutorial - select entity framework c#



Solo tipos primitivos o tipos de enumeraciĆ³n son compatibles en este contexto (3)

El problema con el uso de == y obj.Equals es que Entity Framework no sabe cómo traducir esa llamada al método en SQL --- incluso si sobrecarga esos dos métodos en algo que se traduciría en SQL. Lo que puede hacer para solucionar este inconveniente en Entity Framework es crear un método que devuelva un Árbol de expresiones que haga la comprobación de igualdad más compleja que desea hacer.

Por ejemplo, digamos que tenemos la siguiente clase

public class Person { public string Firstname { get; set; } public string Lastname { get; set; } }

Para devolver una operación de igualdad personalizada que Entity Framework pueda entender, agregue el siguiente método a la clase Person:

public static Expression<Func<Person, bool>> EqualsExpressionTree( Person rhs ) { return ( lhs ) => string.Equals( lhs.Firstname, rhs.Firstname ) && string.Equals( lhs.Lastname, rhs.Lastname ); }

En sus consultas LINQ, puede aprovechar su código personalizado de igualdad de la siguiente manera:

Person anotherPerson = new Person { Firstname = "John", Lastname = "Doe" } personCont.Where( Person.EqualsExpressionTree(anotherPerson) ); //... if ( personCont.Any( Person.EqualsExpressionTree(anotherPerson)) ) { //...

Además, el método EqualsExpressionTree se puede reescribir para llamar a un método Equals estático, lo que le permite aprovechar su lógica de igualdad personalizada. Sin embargo, en todo, recuerde que su código debe traducirse a una expresión SQL , ya que, después de todo, estamos llamando a una base de datos y no estamos accediendo a cosas de la memoria.

He visto muchas preguntas sobre este tema, pero no he podido ordenar ninguno que realmente resuelva el problema que estoy viendo. Tengo una entidad de actividades que rastrea a qué empleado está asignado, así como a qué empleado creó el registro y lo actualizó. Si elimino la línea de código `where a.AssignedEmployee == currentUser '', no obtengo el error de tiempo de ejecución a continuación.

No se puede crear un valor constante de tipo ''DataModels.Employee''. En este contexto solo se admiten tipos primitivos o tipos de enumeración.

CONTROLADOR

var query = from a in db.Activities where a.AssignedEmployee == currentUser where a.IsComplete == false orderby a.DueDate select a; return View(query.ToList());

VER

@model IEnumerable<Data.DataModels.Activity> ..........


No le gusta el hecho de que esté tratando de convertir una igualdad de objetos completos en una consulta de base de datos. Solo puede realizar consultas de marco de entidad utilizando valores constantes, de forma muy similar a como haría las consultas SQL. La forma de resolver esto sería comparar los ID para ver si el ID del Empleado Asignado es el mismo que el ID del usuario actual en la tabla de empleados.

Como nota al margen, si el objeto currentUser que está rastreando no es del tipo Empleado, es posible que desee considerar el almacenamiento en caché del registro Empleado correspondiente de ese usuario para poder consultarlo en consultas posteriores. Eso sería mucho mejor que tratar de pasar por esa mesa constantemente. (De nuevo, esto solo te afectaría si es, de hecho, en una tabla diferente)


Supongo que el error indica que EF no puede traducir el operador de igualdad para Employee a SQL (independientemente de si está asumiendo la igualdad referencial o un operador anulado == ). Suponiendo que la clase Employee tiene un identificador único, intente:

var query = from a in db.Activities where a.AssignedEmployeeId == currentUser.Id where a.IsComplete == false orderby a.DueDate select a; return View(query.ToList());