Альтернативный подход может состоять в том, чтобы изменить способ организации Ритейлера и Клиента.Предполагая, что клиент / ритейлер является лидером, имеют отношение наследования с лидерством.
Customer : Lead
, а также
Retailer : Lead
Теперь вы можете иметь общее свойство для Address, а не HomeAddress и ShopAddress.Теперь Вы вдвое сократили структуру выше.Затем вы можете иметь три предиката по одному для улицы страны и пин-кода и использовать их только в том случае, если строка ввода имеет значение notempty.Вы можете следующий или три предиката, основанные на существовании.
Predicate<Address> countryPred = new Predicate<Address>(a => a.country == country);
Predicate<Address> streetPred = new Predicate<Address>(a => a.street == street);
Predicate<Address> pinPred = new Predicate<Address>(a => a.pin== pin);
Predicate<Address> finalPred;
if(string.IsNullOrEmpty(country))
{
if(finalPred == null)
finalPred = countryPred;
else
finalPred = c => finalPred (c) || countryPred (c);
}
..
..
..
c = c.Where(x=> x.Lead.Address.Any(s=> finalPred));