Универсальное выражение Linq в запросе «element» или IQueryable (многократное использование) - PullRequest
0 голосов
/ 12 мая 2010

У меня есть следующее выражение

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)

1 Ответ

0 голосов
/ 12 мая 2010

Вы не сможете использовать это в выражении запроса, но ваш второй фрагмент кода (явно вызывающий Where) должен быть в порядке.

Для второго запроса трудно сказать, не видя OtherFunctionThatCallsJoinByDateCheck - в основном вы не сможете поместить его в выражение запроса, но если вы сможете передать запрос этой другой функции, это может сработать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...