У меня есть простой метод расширения для фильтрации 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 cast:
"Невозможно ввести тип 'ReleaseGateway.Models.Product' для ввода типа 'ReleaseGateway.Models.ITaggable. LINQ to Entities поддерживает только литье Entity Data Model примитивных типов." (System.NotSupportedException) Исключение System.NotSupportedException catch: "Невозможно ввести тип" Project.Models.Product "для ввода типа 'Project.Models.ITaggable. LINQ to Entities поддерживает только литье Entity Data Model примитивные типы."
Он работает без ограничения, подобного этому, но я должен явно объявить тип 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>();
}
Вопрос: Почему ограничение типа приводит к типу возврата? Могу ли я переписать это, чтобы воспользоваться выводом типа из вызывающего абонента метода расширения?