У меня есть следующее выражение
public static Expression<Func<T, bool>> JoinByDateCheck<T>(T entity, DateTime dateToCheck) where T : IDateInterval
{
return (entityToJoin) =>
entityToJoin.FromDate.Date <= dateToCheck.Date && (entityToJoin.ToDate == null || entityToJoin.ToDate.Value.Date >= dateToCheck.Date);
}
IDateInterval
интерфейс определяется следующим образом:
interface IDateInterval
{
DateTime FromDate {get;}
DateTime? ToDate {get;}
}
и мне нужно применить его несколькими способами:
(1) Запрос к таблице Linq2Sql:
var q1 = from e in intervalTable where FunctionThatCallsJoinByDateCheck(e, constantDateTime) select e;
или как-то так:
intervalTable.Where(FunctionThatCallsJoinByDateCheck(e, constantDateTime))
(2) Мне нужно использовать его в некоторых соединениях таблиц (поскольку linq2sql не обеспечивает сравнительного объединения):
var q2 = from e1 in t1 join e2 in t2 on e1.FK == e2.PK where OtherFunctionThatCallsJoinByDateCheck(e2, e1.FromDate)
или
var q2 = from e1 in t1 from e2 in t2 where e1.FK == e2.PK && OtherFunctionThatCallsJoinByDateCheck(e2, e1.FromDate)
(3) Мне нужно использовать его в некоторых запросах, подобных этому:
var q3 = from e in intervalTable.FilterFunctionThatCallsJoinByDateCheck(constantDate);
Динамический linq - это не то, что я могу использовать, поэтому я должен придерживаться простого linq.
Спасибо
Пояснение:
Изначально у меня был только последний метод (FilterFunctionThatCallsJoinByDateCheck(this IQueryable<IDateInterval> entities, DateTime dateConstant)
), который содержал код из выражения.
Проблема в том, что я получаю SQL Translate exception
, если я пишу код в методе и вызываю его вот так.
Все, что я хочу, - это расширить использование этой функции до предложения where (см. Второй запрос в пункте 2)