У меня есть простой метод расширения для фильтрации LINQ IQueryable по тегам . Я использую это с LINQ to Entities с интерфейсом:
public interface ITaggable
{
ICollection<Tag> Tags { get; }
}
Следующее не работает, возвращая IQueryable
вместо IQueryable
:
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 поддерживает только {{1} } преобразование примитивных типов модели данных сущности ". (System.NotSupportedException) Обнаружено исключение System.NotSupportedException:" Невозможно преобразовать тип 'Project.Models.Product' в тип {{1} } '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>();
}
Вопрос: Почему ограничение типа приводит к типу возвращаемого значения? Могу ли я переписать это, чтобы воспользоваться преимуществами определения типа из вызывающего метода расширения?