【问题标题】:Linq generic Expression in query on "element" or on IQueryable (multiple use)查询“元素”或 IQueryable(多次使用)中的 Linq 通用表达式
【发布时间】:2010-05-12 22:21:23
【问题描述】:

我有下面的表达方式

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 &amp;&amp; OtherFunctionThatCallsJoinByDateCheck(e2, e1.FromDate)

(3) 我需要在一些这样的查询中使用它:

var q3 = from e in intervalTable.FilterFunctionThatCallsJoinByDateCheck(constantDate);

动态 linq 不是我可以使用的,所以我必须坚持使用普通 linq。

谢谢

澄清:

最初我只有最后一个方法 (FilterFunctionThatCallsJoinByDateCheck(this IQueryable&lt;IDateInterval&gt; entities, DateTime dateConstant)),它包含表达式中的代码。

问题是,如果我在一个方法中编写代码并这样调用它,我会得到一个SQL Translate exception

我只想将此函数的使用扩展到 where 子句(参见第 2 点中的第二个查询)

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 好的,想法是我有很多代码必须调用这个条件,并且它必须用作“标准”
    • @Bogdan:问题在于查询表达式会自动将其中的代码转换为 lambda 表达式,然后再将 LINQ to SQL 转换为表达式树。您不想要包含对您的辅助方法的调用的表达式树 - 您希望调用辅助方法本身。这在查询表达式中根本不起作用。
    • 其实我想把方法翻译成SQL
    猜你喜欢
    • 1970-01-01
    • 2020-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多