1

我有以下使用 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 子句中使用语言参数调用第三个表达式?

4

2 回答 2

6

您可以使用一种方法来创建捕获所需值的 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))
于 2013-11-05T14:50:20.953 回答
0

LINQ to 实体中的WhereExpression<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));
于 2013-11-05T15:30:25.187 回答