одна кнопка поиска и два текстовых поля логики оператора if

#c# #asp.net #linq

#c# #asp.net #linq

Вопрос:

У меня есть критерии поиска для поиска информации о транспортном средстве на основе двух видов информации. Первый — это имя контейнера и пользовательское объявление

У меня есть одна кнопка с текстовым поиском и два текстовых поля, первый текст для имени контейнера, а второй для пользовательского объявления.

Я использую EF для объединения трех таблиц с такими содержимым, как это:

 var query = (from con in db.Containers
             join v in db.Vehicles on con.cont_vehicleid equals v.vehl_VehicleID
             join cust in db.Custom_Captions on v.vehl_state equals cust.Capt_Code
             where cust.Capt_Family == "vehl_state" amp;amp; v.vehl_Deleted == null amp;amp; con.cont_Deleted == null amp;amp;
             v.vehl_ClearanceCompany == p.pusr_CompanyId amp;amp; con.cont_Name.Contains(txtContNo.Text)
             select new
             {
                 cont_name = con.cont_Name,
                 vehl_Name = v.vehl_Name,
                 VehicleState = v.vehl_state,
                 vehl_drivername = v.vehl_drivername,
                 vehl_entrancedate = v.vehl_entrancedate,
                 vehl_customsdec = v.vehl_customsdec,
                 cont_rampid = v.vehl_rampid
             }).ToList();



var query2 = (from con in db.Containers
              join v in db.Vehicles on con.cont_vehicleid equals v.vehl_VehicleID
              join cust in db.Custom_Captions on v.vehl_state equals cust.Capt_Code
              where cust.Capt_Family == "vehl_state" amp;amp; v.vehl_Deleted == null amp;amp; con.cont_Deleted == null amp;amp;
              v.vehl_ClearanceCompany == p.pusr_CompanyId amp;amp; con.cont_customdec.Contains(txtCust.Text)
              select new
              {
                  cont_name = con.cont_Name,
                  vehl_Name = v.vehl_Name,
                  VehicleState = v.vehl_state,
                  vehl_drivername = v.vehl_drivername,
                  vehl_entrancedate = v.vehl_entrancedate,
                  vehl_customsdec = v.vehl_customsdec,
                  cont_rampid = v.vehl_rampid
              }).ToList();
  

первый запрос содержит условие для имени контейнера (txtContNo.Text)

второй запрос 2 с именем контейнера формы содержит условие (txtCust.Text)

и это оператор if, который я использовал для обработки запроса для выполнения :

 if (txtContNo.Text != null)
{
    rptVehl.DataSource = query;
    rptVehl.DataBind();
}
if (txtCust.Text != null)
{ 
    rptVehl.DataSource = query2;
    rptVehl.DataBind();
}
  

rptVehl — это инструмент повторения

Каждый раз, когда я компилирую код, ошибок нет, но когда я ввожу имя контейнера в (txtContNo.Text), данные не отображаются, также, когда я использую точку трассировки, код в первом операторе if, который принадлежит (txtContNo.Text), не попадает.

Когда я ввожу пользовательское объявление, оно работает и выдает мне данные о том, что я ищу?

Обратите внимание: если я опущу первый оператор if, второй будет работать нормально и даст мне желаемый результат.

Я думаю, что с логикой if что-то не так. Может кто-нибудь разобраться?

Комментарии:

1. Вы можете сделать общий запрос для обоих условий. если пользователь вводит значение в оба текстовых поля, ваша логика if не будет работать.

2. @SanthoshNayak Как я мог это сделать, пожалуйста, объясните?

3. Поставьте точку останова и проверьте, есть ли какие-либо значения в txtContNo. Текст при поиске

Ответ №1:

Не пробовал, вы можете попробовать что-то вроде этого:

 var query = (from con in db.Containers
             join v in db.Vehicles on con.cont_vehicleid equals v.vehl_VehicleID
             join cust in db.Custom_Captions on v.vehl_state equals cust.Capt_Code
             where cust.Capt_Family == "vehl_state" amp;amp; v.vehl_Deleted == null amp;amp; con.cont_Deleted == null amp;amp;
             v.vehl_ClearanceCompany == p.pusr_CompanyId amp;amp;( con.cont_Name.Contains(txtContNo.Text==null?con.cont_Name:txtContNo.Text)||con.cont_customdec.Contains(txtCust.Text==null?con.cont_customdec:txtCust.Text))
             select new
             {
                 cont_name = con.cont_Name,
                 vehl_Name = v.vehl_Name,
                 VehicleState = v.vehl_state,
                 vehl_drivername = v.vehl_drivername,
                 vehl_entrancedate = v.vehl_entrancedate,
                 vehl_customsdec = v.vehl_customsdec,
                 cont_rampid = v.vehl_rampid
             }).ToList();



    rptVehl.DataSource = query;
    rptVehl.DataBind();
  

Комментарии:

1. большое вам спасибо, он отлично работает с txtContNo. Текст, но когда я ищу txtCust. Текст это дает мне две записи с одинаковой информацией в повторителе?

2. измененное условие

3. проверено, но возникла та же проблема

Ответ №2:

Я бы внес небольшое изменение в Linq и сделал его единым:

 var query = (from con in db.Containers
             join v in db.Vehicles on con.cont_vehicleid equals v.vehl_VehicleID
             join cust in db.Custom_Captions on v.vehl_state equals cust.Capt_Code
             where cust.Capt_Family == "vehl_state" amp;amp; v.vehl_Deleted == null amp;amp; con.cont_Deleted == null amp;amp;
             v.vehl_ClearanceCompany == p.pusr_CompanyId

             select new
             {
               cont_name = con.cont_Name,
               vehl_Name = v.vehl_Name,
               VehicleState = v.vehl_state,
               vehl_drivername = v.vehl_drivername,
               vehl_entrancedate = v.vehl_entrancedate,
               vehl_customsdec = v.vehl_customsdec,
               cont_rampid = v.vehl_rampid
             }).ToList();

if(txtConNo.Text != "")
{
  query = query.Where(con => con.cont_Name.Contains(txtContNo.Text))
}

if(txtCust.Text != "")
{
  query = query.Where(con => con.cont_customdec.Contains(txtCust.Text))
}
  

Наконец, привязка к GridView :

 rptVehl.DataSource = query;
rptVehl.DataBind();
  

Комментарии:

1. можете ли вы получить доступ к con в рамках условия if?

2. продолжение con.cont_Name.Contains(txtContNo.Text)

3. Обновлено. Теперь это сработает. Спасибо за уведомление @Santhosh Nayak.

4. Не работает? в редакторе выдает ошибки преобразования

5. Большое вам спасибо, я изменил код, который вы мне даете, и сработал? я хочу выбрать ваш ответ, но я изменяю код @SanthoshNayak, поэтому я не знаю, чей ответ выбрать?

Ответ №3:

Прежде всего, я хотел бы сказать спасибо вам за каждого, кто внес свой вклад в ответ на мой вопрос.

Я изменил код для AT-2016 и Santhosh Nayak

так что у меня это работает на 100%.

   var query = (from con in db.Containers
                     join v in db.Vehicles on con.cont_vehicleid equals v.vehl_VehicleID
                     join cust in db.Custom_Captions on v.vehl_state equals cust.Capt_Code
                     where cust.Capt_Family == "vehl_state" amp;amp; v.vehl_Deleted == null amp;amp; con.cont_Deleted == null amp;amp;
                     v.vehl_ClearanceCompany == p.pusr_CompanyId amp;amp; con.cont_Name.Contains(txtContNo.Text == null ? con.cont_Name : txtContNo.Text)
                     select new
                     {
                         cont_name = con.cont_Name,
                         vehl_Name = v.vehl_Name,
                         VehicleState = v.vehl_state,
                         vehl_drivername = v.vehl_drivername,
                         vehl_entrancedate = v.vehl_entrancedate,
                         vehl_customsdec = v.vehl_customsdec,
                         cont_rampid = v.vehl_rampid
                     }).ToList();


 var query2 = (from con in db.Containers
                      join v in db.Vehicles on con.cont_vehicleid equals v.vehl_VehicleID
                      join cust in db.Custom_Captions on v.vehl_state equals cust.Capt_Code
                      where cust.Capt_Family == "vehl_state" amp;amp; v.vehl_Deleted == null amp;amp; con.cont_Deleted == null amp;amp;
                      v.vehl_ClearanceCompany == p.pusr_CompanyId amp;amp; con.cont_customdec.Contains(txtCust.Text == null ? con.cont_customdec : txtCust.Text)
                      select new
                      {
                          cont_name = con.cont_Name,
                          vehl_Name = v.vehl_Name,
                          VehicleState = v.vehl_state,
                          vehl_drivername = v.vehl_drivername,
                          vehl_entrancedate = v.vehl_entrancedate,
                          vehl_customsdec = v.vehl_customsdec,
                          cont_rampid = v.vehl_rampid
                      }).ToList();




    if (txtContNo.Text != "")
    {
        rptVehl.DataSource = query;
        rptVehl.DataBind();


    }


    if (txtCust.Text != "")
    {
        rptVehl.DataSource = query2;
        rptVehl.DataBind();


    }
  

Я не буду выбирать это как принятый ответ, большое вам спасибо
AT-2016 и Santhosh Nayak