У меня есть простой метод расширения для фильтрации LINQ IQueryable по тегам. Я использую это с LINQ to Entities с интерфейсом:
public interface ITaggable
{
ICollection<Tag> Tags { get; }
}
Следующее не работает, возвращая IQueryable<ITaggable>
вместо IQueryable<T>
:
public static IQueryable<T> WhereTagged<T>(this IQueryable<T> set, string tag) where T:ITaggable
{
return set.Where(s=>s.Tags.Any(t=>t.Name.ToLower() == tag.ToLower()));
}
Это приводит к исключению приведения LINQ to Entities:
"Невозможно привести тип 'ReleaseGateway.Models.Product' к типу.
'ReleaseGateway.Models.ITaggable. LINQ to Entities поддерживает только
приведение типов примитивных моделей данных сущностей. "
(System.NotSupportedException) System.NotSupportedException было
поймал: «Невозможно привести тип« Project.Models.Product »к типу
'Project.Models.ITaggable. LINQ to Entities поддерживает только приведение
Типы примитивов модели данных объекта. "
Он работает без таких ограничений, но я должен явно объявить тип T в коде моего приложения:
public static IQueryable<T> WhereTagged<T>(this IQueryable<ITaggable> set, string tag)
{
return set.Where(s=>s.Tags.Any(t=>t.Name.ToLower() == tag.ToLower())).Cast<T>();
}
Вопрос: Почему ограничение типа приводит тип возвращаемого значения? Могу ли я переписать это, чтобы воспользоваться выводом типа из вызывающего метода расширения?