В общем, вы можете использовать Func<T, TResult> delegates
для обобщения повторяющихся FilterByValue
методов, вы можете попробовать что-то вроде этого (псевдокод):
public IEnumerable<T> FilterByValue<T>(List<int> value1Ids, IEnumerable<T> data, Func<T, int> selector)
{
if (value1Ids != null)
{
IEnumerable<ExampleData> dataQuery = null;
foreach (int id in value1Ids)
{
int selectedId = id;
if (dataQuery == null)
{
dataQuery = data.Where(x => selector(x) == id);
}
else
{
dataQuery = dataQuery.Union(data.Where(x => selector(x) == id));
}
}
data = dataQuery;
}
return data;
}
Таким образом, вы можете передать фактический выбор свойства:
FilterByValue(criteria.FormTemplateSelected, data, x => SomeValue1);
FilterByValue(criteria.FormTemplateSelected, data, x => SomeValue2);
В зависимости от сценария вы можете пойти еще дальше и применить более сложную логику к делегату, но по коду, который вы вставили, трудно судить, какая часть вас интересует больше всего.