Я пытаюсь использовать DbLinq с базой данных SQLite, но у меня возникает проблема, когда я пытаюсь сделать ITable
как Queryable<TEntity>
.Как сделать таблицу LinqToSql <TEntity> в качестве таблицы <IEntity> где TEntity: IEntity?
Существует известная ошибка в 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.
Почему я пытаюсь это сделать?
У меня есть проект библиотеки, который не знает тип объекта до выполнения, но знает интерфейс для объекта. Итак, я пытаюсь использовать тип интерфейса, чтобы проект библиотеки мог использовать данные.
Вопросы:
- Am I пытается невозможный бросок или это определенно ошибка в DbLinq?
- Как еще я могу решить проблему?
Update
Я переработан мой репозиторий класса, так что теперь занимает TEntity
иTEntityBase
, где TEntity
является фактический тип объекта, и TEntityBase
это интерфейс, который я пытаюсь бросить. Важно отметить, что теперь у меня есть следующий where
пункт в моем определении класса:
where TEntity : class, TEntityBase
Это позволяет мне сохранять мою Table
собственность как Table<TEntity>
вместо ITable
, что позволяет мне использовать AsEnumerable()
(как это было предложено Стивен). Вот пересмотренный метод:
public IEnumerable<TEntityBase> GetAll()
{
return Table.AsEnumerable().Select(e => (TEntityBase)e);
}
И до сих пор, что кажется сделать трюк.
Спасибо, Стивен! Я думаю, что возвращение IEnumerable было бы приемлемым для моих целей, но я не вижу метода или расширения, называемого 'AsEnumerable()' на моем объекте 'ITable'. Могу ли я пропустить ссылку на пространство имен? –
devuxer