Pregunta

Estoy tratando de utilizar DbLinq con una base de datos SQLite, pero estoy corriendo en un problema cuando intento lanzar un ITable como Queryable<TEntity>.

Hay un error conocido en DbLinq ( Edición 211 ), lo que podría ser la fuente de mi problema, pero quería asegurarse de que mi código es el sonido y, si lo es, averiguar si puede haber algo que pueda hacer para solucionar el error.

Este es el método repositorio genérico que los intentos para hacer el reparto:

public IQueryable<TEntity> GetAll()
{
    return Table.Cast<TEntity>(); // Table is an ITable
}

Esto compila, pero si paso en el IPerson interfaz para TEntity y el tipo de las entidades en la tabla es Person (donde Person : IPerson), estoy recibiendo este error de DbLinq:

  

S0133:. Implementar QueryMethod Queryable.Cast

¿Por qué estoy tratando de hacer esto?

Tengo un proyecto de biblioteca que no conoce el tipo de la entidad hasta el tiempo de ejecución, pero lo hace saber la interfaz para la entidad. Por lo tanto, estoy tratando de conversión al tipo de interfaz para que mi proyecto de biblioteca puede consumir los datos.

Preguntas:

  1. ¿Estoy tratando con un reparto imposible o se trata sin duda de un error en DbLinq?
  2. ¿Cómo más podría ir sobre la solución de mi problema?

Actualizar

volví a trabajar mi clase repositorio de forma que ahora tiene un TEntity y a TEntityBase, donde TEntity es el tipo real de la entidad, y TEntityBase es la interfaz que estoy tratando de yeso para. Es importante destacar que, ahora tengo la siguiente cláusula where en mi definición de clase:

where TEntity : class, TEntityBase

Esto me permite guardar mi propiedad Table como Table<TEntity> en lugar de un ITable, lo que me permite usar AsEnumerable() (como se sugiere Stephen). Aquí está el método revisado:

public IEnumerable<TEntityBase> GetAll()
{
    return Table.AsEnumerable().Select(e => (TEntityBase)e);
}

Y hasta ahora, que parece para hacer el truco.

¿Fue útil?

Solución

Suena como un insecto, pero entiendo que la implementación de un proveedor de LINQ es una absolutamente enorme esfuerzo. Incluso LINQ (de Microsoft) a SQL y LINQ a Entidades tienen sus propias restricciones sobre exactamente lo que las consultas LINQ / operaciones apoyan o no apoyan.

Si vuelvo IEnumerable<T> es aceptable, entonces se podría evitar la falta de apoyo a Queryable.Cast llamando AsEnumerable antes de llamar Cast. Sin embargo, esto restringe cómo su DAL pueden ser utilizados:. Desde IQueryable<T> ya no se devuelve, (por ejemplo, las cláusulas Where) no pueden pasar más consultas a través de la capa de DB

Otros consejos

Estoy de acuerdo que suena como un error. Usted podría tratar de los siguientes elementos que va a hacer lo mismo

return Table.Select<TEntity>(tbl => (TEntity)tbl)

Puede que tenga que añadir un donde:. ITable a la definición del método, así

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