Как условно добавить выражение ANY () внутри WHERE () в IQueryable EF - PullRequest
0 голосов
/ 08 октября 2018

У меня есть сценарий, где мне нужно добавить условия внутри ЛЮБОГО () внутри условия WHERE ()

IQueriable<Lead> c = DBContext.Lead;

if(Retailer)
{
  if(!string.IsNullOrEmpty(country))
  {
    c = c.Where(x=> x.Retailer.ShopAddress.Any(s=>s.country == country);
  }
  if(!string.IsNullOrEmpty(street))
  {
    c = c.Where(x=> x.Retailer.ShopAddress.Any(s=>s.street== street);
  }
  if(!string.IsNullOrEmpty(pin))
  {
    c = c.Where(x=> x.Retailer.ShopAddress.Any(s=>s.pin== pin);
  }
}else
{
   if(!string.IsNullOrEmpty(country))
  {
    c = c.Where(x=> x.Customer.HomeAddress.Any(s=>s.country == country);
  }
  if(!string.IsNullOrEmpty(street))
  {
    c = c.Where(x=> x.Customer.HomeAddress.Any(s=>s.street== street);
  }
  if(!string.IsNullOrEmpty(pin))
  {
    c = c.Where(x=> x.Customer.HomeAddress.Any(s=>s.pin== pin);
  } 
}
  • Мне нужно добавить условие внутри ЛЮБОГО () как подобный метод, так что еслиданы улица и пин, тогда он должен быть в одной записи.
  • здесь результат будет похож на условие ИЛИ.
  • как использовать метод вместо ЛЮБОГО () для возвратаэто как ЛЮБОЙ с условно добавленными условиями?
  • Мне это нужно только на лямбду.

1 Ответ

0 голосов
/ 08 октября 2018

Альтернативный подход может состоять в том, чтобы изменить способ организации Ритейлера и Клиента.Предполагая, что клиент / ритейлер является лидером, имеют отношение наследования с лидерством.

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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...