2015-10-19 3 views
2

У меня есть запрос ниже, где я передаю 4 параметра из пользовательского интерфейса. BU и Region имеют параметры переключателя (All, Option1, Option2, Option3 и т. Д.) В пользовательском интерфейсе. Параметры 1 - 3 - это значения в данных, тогда как «Все» - нет.Проверки нескольких условий в запросе?

Есть ли способ написать ниже более эффективно? Например, если значения BU или Region являются «Все» из пользовательского интерфейса »(которые не являются значениями в наборе данных), есть ли символ, который я могу присвоить bu или region, если все выбрано так, что запрос знает, чтобы выбрать все значения?

Я не знаю, есть ли такая вещь, но я хочу избежать необходимости делать что-то вроде ниже.

 public string GetAvgSeatPrice(string bu, string region, DateTime? startDate, DateTime? endDate) 
    { 

     if (bu.Equals("All")) 
     { 
      var averageSeatPrice = (from r in db.Registrations 
            where 
             //r.BusinessUnit.Equals(bu) && 
             r.Region.Equals(region) && 
             r.StartDate >= startDate && 
             r.EndDate <= endDate && 
             r.ActualPrice > 0 
            select r.ActualPrice).Average(); 

      var AvgSeatPrice = "$" + string.Format("{0:0.00}", averageSeatPrice); 

      return AvgSeatPrice; 
     } 
     else if (region.Equals("All")) 
     { 
      var averageSeatPrice = (from r in db.Registrations 
            where 
             r.BusinessUnit.Equals(bu) && 
             // r.Region.Equals(region) && 
             r.StartDate >= startDate && 
             r.EndDate <= endDate && 
             r.ActualPrice > 0 
            select r.ActualPrice).Average(); 

      var AvgSeatPrice = "$" + string.Format("{0:0.00}", averageSeatPrice); 

      return AvgSeatPrice; 
     } 
     else if (bu.Equals("All") && region.Equals("All")) 
     { 
      var averageSeatPrice = (from r in db.Registrations 
            where 
             //r.BusinessUnit.Equals(bu) && 
             // r.Region.Equals(region) && 
             r.StartDate >= startDate && 
             r.EndDate <= endDate && 
             r.ActualPrice > 0 
            select r.ActualPrice).Average(); 

      var AvgSeatPrice = "$" + string.Format("{0:0.00}", averageSeatPrice); 

      return AvgSeatPrice; 
     } 
     else 
     { 
      var averageSeatPrice = (from r in db.Registrations 
            where 
             r.BusinessUnit.Equals(bu) && 
             r.Region.Equals(region) && 
             r.StartDate >= startDate && 
             r.EndDate <= endDate && 
             r.ActualPrice > 0 
            select r.ActualPrice).Average(); 

      var AvgSeatPrice = "$" + string.Format("{0:0.00}", averageSeatPrice); 

      return AvgSeatPrice; 
     } 

    } 

} 

}

+0

Что не так с вашим текущим кодом? У вас есть ошибка? –

+0

Если я перехожу в Вариант 1, 2 или 3, он работает, потому что это значения в данных, которые я могу назначить этим параметрам.Если я выберу «Все», для сравнения нет ничего, потому что нет никакой ценности, чтобы назначить All для сравнения в «Где». Мне интересно, есть ли символ, который я могу назначить для опции «Все», чтобы он не фильтровал. – JReam

ответ

4

Просто сделать это:

public string GetAvgSeatPrice(string bu, string region, DateTime? startDate, DateTime? endDate) 
    { 
     var averageSeatPrice = (
      from r in db.Registrations 
      where (bu == "ALL" || r.BusinessUnit.Equals(bu)) 
      && (region == "ALL" || r.Region.Equals(region)) 
      && r.StartDate >= startDate 
      && r.EndDate <= endDate 
      && r.ActualPrice > 0 
      select r.ActualPrice).Average(); 

     var AvgSeatPrice = "$" + string.Format("{0:0.00}", averageSeatPrice); 

     return AvgSeatPrice; 
    } 

Из-ИЛИ (||), если выбрано значение «ALL» второе условие никогда не проверяется и не сузить выбор вниз по данному свойству. Он проверяется только в том случае, если выбор НЕ «ВСЕ», и в этом случае выбор сужается.

+0

Спасибо, однако, «ВСЕ» не является значением в наборе данных, я ищу символ, который заменит «ВСЕ», чтобы я мог назначить его bu перед запросом, чтобы запрос не фильтровал. Я даже не знаю, есть ли такая вещь, но я пытаюсь найти лучшее решение для вышеуказанного кода, который я обновил, чтобы попытаться прояснить мое желание. – JReam

+0

Я посмотрел на ваш обновленный вопрос, и я все еще думаю, что мой ответ делает именно то, что вы хотите. Обратите внимание, что я НЕ сравниваю «ВСЕ» с набором данных в первой части (перед ||). Я просто проверяю, что происходит из пользовательского интерфейса, и если это «ВСЕ», тогда все условие уже верно, а вторая часть никогда не проверяется, а это значит, что вы получите все записи. –

+0

Допустим, что единственными значениями в поле BU являются «Кошки», «Собаки» и «Птицы». Если из пользовательского интерфейса будет передано «ALL», на основе вашего решения он будет ограничивать записи до 0, потому что «ALL» не является значением в BU. Правильно? Что мне не хватает? – JReam

2

Я надеюсь, что это не совсем то, что вы просите, чтобы не предоставили (я мог бы истолковать мультипликатор если/другое дело/и т.д. два отдельных пути от вашего вопроса). Но вы могли бы сделать что-то вроде этого:

var averageSeatPrice = 
    from r in db.Registrations 
    where r.StartDate >= startDate && 
      r.EndDate <= endDate && 
      r.ActualPrice > 0 

// note I'm assuming your "bu" "all" option is represented as the string "All" 
if (bu.ToUpper() != "ALL") 
    averageSeatPrice = averageSeatPrice 
     .Where(w => w.BusinessUnit == bu); 

if (region.ToUpper() !+ "ALL") 
    averageSeatPrice = averageSeatPrice 
     .Where(w => w.Region == region); 

averageSeatPrice = averageSeatPrice select r.ActualPrice).Average(); 

К сожалению, я менее ясно с синтаксисом LinQ вы используете (или я сделал бы мой ответ с этим), надеюсь, что это помогает, хотя.

В принципе, если заявление государства, если эта опция не все, то лавировать на той части, где положение в противном случае он никогда не пристегивается, и никогда не становится частью запроса.

Kritner - можете ли вы подробно рассказать о том, что вы здесь делаете? кажется, интересный подход слишком

Учитывая BusinessUnit может иметь следующие значения:

option1 
option2 
option3 

если bu предоставляется в option1 то мы должны наш ИНЕКЕ содержать where BusinessUnit = 'option1'

так:

if (bu.ToUpper() != "ALL") // bu is option1, evaluates true 
    averageSeatPrice = averageSeatPrice // add the where clause to the IQueryable 
     .Where(w => w.BusinessUnit == bu); // deferred execution, so have not yet executed query, and can continue to modify and only do a single trip to db 

Теперь о ther hand, если bu - это «ВСЕ» или string.empty, или что бы вы ни хотели, чтобы это не было допустимым значением, тогда мы не хотим, чтобы BusinessUnit был частью предложения where вообще ... опубликовал код выполняет этот сценарий, а также:

if (bu.ToUpper() != "ALL") // this evaluates to false (bu is "ALL"), don't add the where clause information at all. 
    averageSeatPrice = averageSeatPrice 
     .Where(w => w.BusinessUnit == bu); 

Каждый averageSeatPrice = averageSeatPrice.Where(...) не просто прикрепил на запрос до точки, в которой вы пронумеровать результаты.

+0

Kritner - можете ли вы немного рассказать о том, что вы здесь делаете? похоже, интересный подход. – JReam

Смежные вопросы