代码之家  ›  专栏  ›  技术社区  ›  Bogdan Maxim

“element”或IQueryable查询中的LINQ泛型表达式(多用途)

  •  0
  • Bogdan Maxim  · 技术社区  · 15 年前

    我有以下表达式

    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 回复  |  直到 15 年前
        1
  •  0
  •   Jon Skeet    15 年前

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

    对于第二个问题,很难说没有看到 OtherFunctionThatCallsJoinByDateCheck -基本上,您无法将其放入查询表达式中,但如果您可以将查询传递给另一个函数,则可能会起作用。