我使用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参数调用第三个表达式?
答案 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));