Я пытаюсь использовать DbLinq с базой данных SQLite, но у меня возникает проблема, когда я пытаюсь преобразовать ITable
в Queryable<TEntity>
.
В DbLinq есть известная ошибка ( Issue 211 ), которая может быть источником моей проблемы, но я хотел убедиться, что мой код исправен, и, если это так, выяснить, есть ли может быть что-то, что я могу сделать, чтобы обойти ошибку.
Вот общий метод репозитория, который пытается выполнить приведение:
public IQueryable<TEntity> GetAll()
{
return Table.Cast<TEntity>(); // Table is an ITable
}
Это компилируется, но если я передаю интерфейс IPerson
для TEntity
и тип сущностей в таблице Person
(где Person : IPerson
), я получаю эту ошибку от DbLinq:
S0133: реализовать QueryMethod Queryable.Cast.
Почему я пытаюсь это сделать?
У меня есть библиотечный проект, который не знает тип объекта до времени выполнения, но он знает интерфейс для объекта. Итак, я пытаюсь привести тип интерфейса, чтобы мой библиотечный проект мог использовать данные.
Вопросы:
- Я пытаюсь выполнить невозможное приведение или это определенно ошибка в DbLinq?
- Как еще я могу решить свою проблему?
Обновление
Я переработал свой класс репозитория, теперь он принимает TEntity
и a TEntityBase
, где TEntity
- фактический тип сущности, а TEntityBase
- интерфейс, который я ' Я пытаюсь бросить на. Важно отметить, что в моем определении класса теперь есть следующее предложение where
:
where TEntity : class, TEntityBase
Это позволяет мне хранить мое свойство Table
как Table<TEntity>
вместо ITable
, что позволяет мне использовать AsEnumerable()
(как предложил Стивен). Вот пересмотренный метод:
public IEnumerable<TEntityBase> GetAll()
{
return Table.AsEnumerable().Select(e => (TEntityBase)e);
}
И до сих пор этот , кажется, делает свое дело.