Как вы бросаете таблицу LinqtoSQL <Щелтение> в качестве таблицы Где напряженность: iEntity?
-
26-09-2019 - |
Вопрос
Я пытаюсь использовать DBLINQ с базой данных SQLite, но я вступаю в проблему, когда я пытаюсь бросить ITable
как Queryable<TEntity>
.
В Днинке есть известная ошибка (Выпуск 211.), который может быть источником моей проблемы, но я хотел убедиться, что мой код звучит, и, если оно, узнать, может быть, может быть что-то, что я могу сделать, чтобы работать вокруг ошибки.
Вот универсальный метод репозитория, который пытается сделать актером:
public IQueryable<TEntity> GetAll()
{
return Table.Cast<TEntity>(); // Table is an ITable
}
Это компилирует, но если я пройду в интерфейсе IPerson
для TEntity
и тип объектов в таблице Person
(куда Person : IPerson
), Я получаю эту ошибку из Dblinq:
S0133: внедрить QueryMethod Queryable.Cax.
Почему я пытаюсь сделать это?
У меня есть библиотечный проект, который не знает тип объекта до времени выполнения, но он знает интерфейс для объекта. Итак, я пытаюсь отбрасывать в тип интерфейса, чтобы мой библиотечный проект может потреблять данные.
Вопросы:
- Я пытаюсь сделать невозможным отлив или это определенно ошибка в Длинке?
- Как еще я мог пойти по решению моей проблемы?
Обновлять
Я переработал мой класс репозитория, чтобы он теперь принимает 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);
}
И до сих пор, что кажется сделать трюк.
Решение
Это звучит как ошибка, но понимать, что реализация провайдера LINQ является абсолютно огромным усилением. Даже (Microsoft's) Linq для SQL и LINQ к объектам имеют свои собственные ограничения на то, какие запросы / операции LINQ они поддерживают или не поддерживают.
При возврате IEnumerable<T>
приемлемо, тогда вы можете работать вокруг отсутствия поддержки для Queryable.Cast
Позвонив AsEnumerable
до звонка Cast
. Отказ Однако это ограничивает то, как ваш DAL можно использовать: поскольку IQueryable<T>
больше не возвращается, дальнейшие запросы (например, Where
пункты) не будут переданы на слой БД.
Другие советы
Я согласен, это звучит как ошибка. Вы можете попробовать следующее, что сделает то же самое
return Table.Select<TEntity>(tbl => (TEntity)tbl)
Возможно, вам придется добавить A, где: случайный определение метода.