使用表达式<func <>&gt;在带有参数</func <>的Where子句中

时间:2013-11-05 14:42:07

标签: c# linq entity-framework

我使用linq方法语法

进行以下查询
IEnumerable<PageElement> elements_test = ObjectContext.PageElements
            .Where(_dateDebutCheck).Where(_dateFinCheck)
            .Where(_activeLanguageCheck(language));

private readonly Expression<Func<PageElement, bool>> _dateDebutCheck = pe => pe.DateDebut.HasValue && pe.DateDebut.Value <= DateTime.Now;
private readonly Expression<Func<PageElement, bool>> _dateFinCheck = pe => !pe.DateFin.HasValue || pe.DateFin.Value > DateTime.Now;

private readonly Expression<Func<PageElement, byte, bool>> _activeLanguageCheck =
        (pe, lang) => pe.PageElementLanguages.Where(y => y.Active).Select(y => y.LanguageId).Contains(lang);

对于不带参数的前2个表达式,语法似乎是正确的,如何在Where子句中使用language参数调用第三个表达式?

2 个答案:

答案 0 :(得分:5)

您可以使用一个方法创建lambda 捕获所需的值,而不是使用带有额外参数的lambda:

private Expression<Func<PageElement, bool>> ActiveLanguageCheck(byte lang) {
    return pe => pe.PageElementLanguages.Where(
                    y => y.Active).Select(y => y.LanguageId).Contains(lang);
}

然后只是:

.Where(ActiveLanguageCheck(language))

答案 1 :(得分:0)

LINQ to实体中的Where需要Expression<Func<TSource, Boolean>>,这不是你拥有的。

所以您的问题是:如何将Expression<Func<PageElement, byte, bool>>转换为Expression<Func<PageElement, bool>>

这是一个简单的辅助函数:

public static Expression<Func<T1, TResult>> ToSimpleFunc<T1, T2, TResult>(Expression<Func<T1, T2, TResult>> f, T2 value)
{
    var invokeExpression = Expression.Invoke(f, f.Parameters[0], Expression.Constant(value));
    return Expression.Lambda<Func<T1, TResult>>(invokeExpression, f.Parameters[0]);
}

这样称呼:

IEnumerable<PageElement> elements_test = ObjectContext.PageElements
        .Where(_dateDebutCheck).Where(_dateFinCheck)
        .Where(ToSimpleFunc(_activeLanguageCheck, language));