我有以下表达式
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点中的第二个查询)
答案 0 :(得分:0)
您将无法在查询表达式中使用它,但您的第二个代码段(显式调用Where
)应该没问题。
对于第二个查询,很难说没有看到OtherFunctionThatCallsJoinByDateCheck
- 基本上你将无法将它放在查询表达式中,但如果你可以将查询传递给另一个函数,那可能会有效。