В моей настройке LINQ to SQL у меня есть различные таблицы, которые отображаются на классы, которые в основном поддерживают один и тот же интерфейс для поддержки управления версиями, т.е.
public interface IValid
{
int? validTo { get; }
int validFrom { get; }
}
Классы LINQ to SQL наследуются от этого интерфейса следующим образом:
public partial class representationRevision : IValid
{
}
Теперь я хотел бы определить СУХОЙ (не повторяющийся) способ фильтрации EntitySet<T>
, IEnumerable<T>
и IQueryable<T>
, чтобы результирующие списки действовали для конкретной ревизии. Я пытался сделать это:
public static class ExtensionMethods
{
public static IQueryable<T> ValidFor<T>(this IQueryable<T> v, int? revision)
where T : IValid
{
return v.Where(cr => ((cr.validFrom <= revision) &&
((cr.validTo == null) || (cr.validTo > revision)))
|| ((revision == null) && (cr.validTo == null))
);
}
}
Но это создает проблемы на EntitySet<T>
. Я добавил специальную реализацию для EntitySet, которая сначала вызывает AsQueryable (), но это вызывает исключение. Не пытаясь создать предикат, я мог использовать подход Where(predicate)
:
public static Expression<Func<contentRevision, bool>> IsValidFor(int? revision)
{
return ((cr) => ((cr.validFrom <= revision) &&
((cr.validTo == null) || (cr.validTo > revision)))
|| ((revision == null) && (cr.validTo == null)));
}
При использовании с .Where<contentRevision>(IsValidFor(revision))
выдает такие ошибки, как:
Ошибка 5 'System.Data.Linq.EntitySet' делает
не содержат определения для «Где» и наилучшего метода расширения перегрузки
«System.Linq.Enumerable.Where
(System.Collections.Generic.IEnumerable, System.Func) 'имеет
некоторые неверные аргументы
Обратите внимание, что это даже без использования интерфейса IValid ... Я пробовал всевозможные варианты этой темы (например, добавление параметра int), но все они неизменно оказываются неудачными. Какие-нибудь указатели, чтобы направить меня в правильном направлении?