У меня есть набор POCO, каждый из которых реализует следующий простой интерфейс:
interface IIdObject
{
int Id { get; set; }
}
Подмножество этих POCO реализует этот дополнительный интерфейс:
interface IDeletableObject : IIdObject
{
bool IsDeleted { get; set; }
}
У меня есть иерархия хранилища, которая выглядит примерно так:
IRepository <: BasicRepository <T><: ValidatingRepository <T>(где T - это IIdObject)
Я пытаюсь добавить FilteringRepository в иерархию таким образом, чтобы у всех POCO, которые реализуют IDeletableObject
, был применен фильтр Where(p => p.IsDeleted == false)
до того, как будут выполнены любые другие запросы. Моя цель - избежать дублирования иерархии исключительно для IDeletableObjects.
Моя первая попытка выглядела так:
public override IQueryable<T> Query()
{
return base.Query().Where(t => ((IDeletableObject)t).IsDeleted == false);
}
Это хорошо работает с LINQ to Objects, но когда я переключаюсь на бэкэнд EF, я получаю: "LINQ to Entities поддерживает только приведение типов примитивов Entity Data Model."
Я продолжал пробовать некоторые причудливые параметризованные решения, но в итоге они потерпели неудачу, потому что я не мог сделать T-ковариантным в следующем случае по какой-то причине, которую я не совсем понимаю:
interface IQueryFilter<out T> // error
{
Expression<Func<T, bool>> GetFilter();
}
Я был бы рад более подробно рассказать о моих более сложных решениях, если бы это помогло, но я думаю, что пока остановлюсь здесь в надежде, что у кого-то может появиться идея попробовать.
Заранее большое спасибо!