2010-05-12 1 views
2

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

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

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

Вопросы:

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

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); 
} 

И до сих пор, что кажется сделать трюк.

ответ

2

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

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

+0

Спасибо, Стивен! Я думаю, что возвращение IEnumerable было бы приемлемым для моих целей, но я не вижу метода или расширения, называемого 'AsEnumerable()' на моем объекте 'ITable'. Могу ли я пропустить ссылку на пространство имен? – devuxer

2

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

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

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

+0

Спасибо, Бен. Увы, такая же проблема, как с ответом Стивена. 'Select()' не представляется доступным для ITable. – devuxer