Вернуть тип ввода универсального с ограничением типа в LINQ to Entities (EF4.1)

У меня есть простой метод расширения для фильтрации 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>();
}

Вопрос: Почему ограничение типа приводит к типу возвращаемого значения? Могу ли я переписать это, чтобы воспользоваться преимуществами определения типа из вызывающего метода расширения?

10
задан Jason Suárez 17 November 2011 в 22:34
поделиться