Если у вас есть следующие методы расширения:
public static class BoolExtensions
{
public static bool And<TR, TC>(this IEnumerable<Func<TR, TC, bool>> statements, TR value, TC criteria)
{
foreach (var statement in statements)
{
if (!statement.Invoke(value, criteria))
{
return false;
}
}
return true;
}
public static bool Or<TR, TC>(this IEnumerable<Func<TR, TC, bool>> statements, TR value, TC criteria)
{
foreach (var statement in statements)
{
if (statement.Invoke(value, criteria))
{
return true;
}
}
return false;
}
}
Тогда вы можете объявить свои заявления в виде списка:
List<Func<TypeOfR, TypeOfC, bool>> statements = new List<Func<TypeOfR, TypeOfC, bool>>()
{
{ (r, c) => r.Id == c.SampleId },
{ (r, c) => r.Status.SampleStatusId == c.SampleStatusId },
...
};
И напишите ваш запрос как:
var results = from r in Table where
statements.And(r, criteria)
select r;
или для ||
версии:
var results = from r in Table where
statements.Or(r, criteria)
select r;
и просто храните утверждения в одном месте.