Как вы бросаете таблицу LinqtoSQL <Щелтение> в качестве таблицы Где напряженность: iEntity?

StackOverflow https://stackoverflow.com/questions/2821935

Вопрос

Я пытаюсь использовать 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.

Почему я пытаюсь сделать это?

У меня есть библиотечный проект, который не знает тип объекта до времени выполнения, но он знает интерфейс для объекта. Итак, я пытаюсь отбрасывать в тип интерфейса, чтобы мой библиотечный проект может потреблять данные.

Вопросы:

  1. Я пытаюсь сделать невозможным отлив или это определенно ошибка в Длинке?
  2. Как еще я мог пойти по решению моей проблемы?

Обновлять

Я переработал мой класс репозитория, чтобы он теперь принимает 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, где: случайный определение метода.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top