我有以下表达式
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点中的第二个查询)