Pregunta

Estoy trabajando a través del código MVC Storefront y tratando de seguir la ruta de un repositorio, un servicio y un modelo que es poco, fuera del contexto dbml / data. En realidad, es bastante fácil de seguir, hasta que comencé a escribir pruebas y las cosas fallaron de una manera que simplemente no entiendo.

En mi caso, la clave primaria es un identificador único en lugar de un campo int. El repositorio devuelve un IQueryable:

public IQueryable<Restaurant> All()
{
    return from r in _context.Restaurants select new Restaurant(r.Id)
        {
             Name = r.Name
        };
 }

En este caso, el restaurante es un restaurante de modelos, por supuesto, y no _context.Restaurants.Restaurant.

Filtrando en la clase de servicio (o en pruebas unitarias de repositorio) contra All (), esto funciona como se esperaba:

var results = Repository.All().Where(r => r.Name == "BW<3").ToList();

Esto funciona bien, tiene un Modelo.Restaurante. Ahora, si intento lo mismo con el pkid:

var results = Repository.All().Where(r => r.Id == new Guid("088ec7f4-63e8-4e3a-902f-fc6240df0a4b")).ToList();

Si falla con:

The member 'BurningPlate.Models.Restaurant.Id' has no supported translation to SQL.

Si se ven algunas publicaciones similares donde la gente dice que es porque r = > r.Id es [Model.Restaurants] es un nivel de clase que la capa linq2sql no conoce. Para mí, eso significa que la primera versión tampoco debería funcionar. Por supuesto, si mi paquete es un int, funciona bien.

¿Qué está pasando realmente aquí? Dios sabe que no es muy intuitivo tener un trabajo y otro no. ¿Qué estoy malentendido?

¿Fue útil?

Solución

Creo que el problema aquí se debe al uso de una sobrecarga del constructor y a esperar que la consulta la complete. Cuando realiza una proyección como esta, tiene que poner todas las cosas que desea en la consulta de proyección en el Proyección real en sí. De lo contrario, Linq no lo incluirá en la consulta SQL.

Entonces, reescribe tus bits así:

return from r in _context.Restaurants select new Restaurant()
        {
             Id=r.Id,
             Name = r.Name
        };

Esto debería solucionarlo.

Otros consejos

Al no haber escrito este código, ¿lo has intentado?

var results = Repository.All (). Where (r = > r.Id.Equals (new Guid (" 088ec7f4-63e8-4e3a-902f-fc6240df0a4b ")). ToList ()

Ninja

esto probablemente tenga que ver con el hecho de que está intentando crear una instancia de la guía en la consulta, y creo que LINQ to SQL está tratando de convertirlo en un código SQL real antes de que se cree el objeto.

Intenta crear instancias antes de la consulta y no en la consulta.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top