Вы не можете использовать Func
, вам нужно использовать Expression<Func>
.
+
можно сделать через Expression.And
.
Обновление (не тестировалось):
Expression<Func<vwMailMerge, bool>> whereClause = null;
...
Expression<Func<vwMailMerge, bool>> MailMergeWhereClause(
params Expression<Func<vwMailMerge, bool>>[] wheres)
{
if (wheres.Length == 0) return x => true;
Expression result = wheres[0].Body;
for (int i = 1; i < wheres.Length; i++)
{
//probaby needs a parameter fixup, exercise for reader
result = Expression.And(result, wheres[i].Body);
}
return Expression.Lambda<Func<vwMailMerge,bool>>(result, wheres[0].Parameters);
}
Обновление 2:
Вышеупомянутый подход не работает, как я ожидал. Это может быть легко решить в .NET 4 с использованием класса ExpressionVistor
. Для .NET 3.5 (или если вышеупомянутое слишком сложно) должно работать следующее.
Подход заключается в добавлении предложений where в IQueryable
напрямую, чтобы вы получили:
somequery.Where(x => x.foo).Where(x => x.bar).Where(x => x.baz)
Итак, вы можете просто добавить их по мере необходимости, но это потребует некоторых изменений в логике / потоке вставленного вами кода.