查询“元素”或IQueryable上的Linq泛型表达式(多次使用)

时间:2010-05-12 14:08:40

标签: c# .net linq linq-to-sql

我有以下表达式

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 :(得分:0)

您将无法在查询表达式中使用它,但您的第二个代码段(显式调用Where)应该没问题。

对于第二个查询,很难说没有看到OtherFunctionThatCallsJoinByDateCheck - 基本上你将无法将它放在查询表达式中,但如果你可以将查询传递给另一个函数,那可能会有效。