Как вы преобразуете таблицу LinqToSql <TEntity>в таблицу <IEntity>, где TEntity: IEntity? - PullRequest
2 голосов
/ 12 мая 2010

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

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

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

Вопросы:

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

Обновление

Я переработал свой класс репозитория, теперь он принимает 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);
}

И до сих пор этот , кажется, делает свое дело.

Ответы [ 2 ]

2 голосов
/ 12 мая 2010

Я согласен, это звучит как ошибка. Вы можете попробовать следующее, что сделает то же самое

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

Возможно, вам придется добавить where: ITable к определению метода.

2 голосов
/ 12 мая 2010

Звучит как ошибка, но поймите, что реализация поставщика LINQ - это огромное усилие. Даже (Microsoft) LINQ to SQL и LINQ to Entities имеют свои собственные ограничения на то, какие именно запросы / операции LINQ они поддерживают или не поддерживают.

Если возвращение IEnumerable<T> приемлемо, то вы можете обойти отсутствие поддержки Queryable.Cast, позвонив AsEnumerable перед вызовом Cast. Однако это ограничивает использование вашего DAL: поскольку IQueryable<T> больше не возвращается, дальнейшие запросы (например, предложения Where) не будут передаваться на уровень БД.

...