Confusione nella mia If Else, Else If Condition. in C # [chiuso]

-1

Ho tre colonne come segue:

  • Mese
  • Tech
  • Circolo

Secondo questa colonna ho bisogno di recuperare i dati.

Nella colonna del mese, i dati sono: gen, feb, marzo ... e così via.
Nella colonna tecnica, i dati sono: Gsmnqi, Gsmboi ... e così via.
In Circle Column, Data è: Ap, Kol, Mumbai .. e così via.

Voglio provare quattro condizioni come segue:

  1. se seleziono il mese in cui verranno recuperati i dati relativi al mese, la tecnologia e il cerchio non verranno selezionati.
  2. se seleziono il mese e tech recupererà i dati relativi al mese e alla tecnologia, la cerchia non verrà selezionata.
  3. se seleziono il mese e cerchiamo di recuperare i dati relativi al mese e al cerchio, Tech non verrà selezionato.
  4. se seleziono mese, tecnologia e cerchio, recupererà i dati relativi a mese, tecnologia e cerchio.

Ma la mia condizione if non funziona, seriamente mi confondo se, altrimenti, se per queste quattro condizioni.

  if (nqiSqiEntity.Month != string.Empty)
  {
      query.AppendLine("select * from K2_NQISQI with (nolock) where MONTH = '" + nqiSqiEntity.Month + "'  order by id asc");
  }
  else if (nqiSqiEntity.Month != string.Empty && nqiSqiEntity.Tech != string.Empty)
  {
      query.AppendLine("select * from K2_NQISQI with (nolock) where MONTH = '" + nqiSqiEntity.Month + "' and TECH = '" + nqiSqiEntity.Tech + "' order by id asc");
  }
  else if (nqiSqiEntity.Month != string.Empty && nqiSqiEntity.Circle != string.Empty)
  {
      query.AppendLine("select * from K2_NQISQI with (nolock) where MONTH = '" + nqiSqiEntity.Month + "' and CIRCLE = '" + nqiSqiEntity.Circle + "' order by id asc");
  }
  else
  {
      query.AppendLine("select * from K2_NQISQI with (nolock) where MONTH = '" + nqiSqiEntity.Month + "' and CIRCLE = '" + nqiSqiEntity.Circle + "' and TECH '" + nqiSqiEntity.Tech + "' order by id asc");
  }

In condizione, invece di string.Empty ho bisogno di mettere il valore o ho bisogno di controllare se il valore è presente quindi solo la condizione dovrebbe essere eseguita. Per favore, aiutami gentilmente a capire questo codice.

    
posta HPR 18.07.2014 - 15:57
fonte

2 risposte

6

Se scrivi una dichiarazione

if(A)
{
    // ... foo
}
else if(A && B)
{
    // ... bar
}

il secondo blocco non verrà mai eseguito. Dal momento che se A è vero, non importa quale sia B, il primo blocco viene eseguito. se A è falso, nessuna delle due condizioni è vera, quindi nessuno dei due blocchi viene eseguito. Quello che puoi fare qui è cambiare ordine:

if(A && B)
{
    // ... bar
}
else if(A)
{
    // ... foo
}

(l'idea è di testare prima la condizione più restrittiva, e solo se fallisce, testare la condizione meno restrittiva).

Tuttavia, nel tuo caso l'intera logica non è necessaria e il tuo codice contiene troppi duplicati. La ripetizione quadrupla di

  query.AppendLine("select * from K2_NQISQI with (nolock) where ...")

è un odore di codice sfacciato. Suggerisco di risolvere questo sulla falsariga di:

 var conditions = new List<string>();
 if (nqiSqiEntity.Month != string.Empty)
     conditions.Add("MONTH = '" + nqiSqiEntity.Month+"'");
 if(nqiSqiEntity.Tech != string.Empty)
     conditions.Add("TECH = '" + nqiSqiEntity.Tech+"'");
 if(nqiSqiEntity.Circle != string.Empty)
     conditions.Add("CIRCLE = '" + nqiSqiEntity.Circle + "'");
 if(conditions.Count>0)
 {
      string finalCondition= "select * from K2_NQISQI with (nolock) WHERE " + 
                            string.Join(" and ", conditions.ToArray())
                            + " order by id asc";
      query.AppendLine(finalCondition);
 }

attenzione, questo è "codice aereo", e non si occupa del fatto che nella tua domanda nqiSqiEntity.Month è sempre richiesto per creare la condizione.

    
risposta data 18.07.2014 - 16:27
fonte
0

Vedi che questa parte viene ripetuta ogni volta?

"select * from K2_NQISQI with (nolock) where MONTH = '"  + nqiSqiEntity.Month 

Vedi che per le altre colonne vuoi solo AND di esse al core SELECT sopra?

Vedete che se nqiSqiEntity.Month è string.Empty non potete creare una query valida?

Quindi il codice sarebbe simile a questo:

  if (nqiSqiEntity.Month != string.Empty)
  {
      query.AppendLine("select * from K2_NQISQI with (nolock) where MONTH = '" + nqiSqiEntity.Month + "'");

      if (nqiSqiEntity.Tech != string.Empty)
      {
          query.AppendLine("' and TECH = '" + nqiSqiEntity.Tech + "'");
      }

      if (nqiSqiEntity.Circle != string.Empty)
      {
          query.AppendLine("' and CIRCLE = '" + nqiSqiEntity.Circle ");
      }

      query.AppendLine( "'  order by id asc");
  }

Di seguito è riportato un modo migliore per scrivere gli allegati. Evita tutte le concatenazioni di doppie virgolette, virgolette singole, "+" e difficoltà e incline agli errori.

  if (nqiSqiEntity.Month != string.Empty)
  {
      query.AppendFormat("select * from K2_NQISQI with (nolock) where MONTH = '{0}'",nqiSqiEntity.Month);
      if (nqiSqiEntity.Tech != string.Empty)
      {
          query.AppendFormat("' and TECH = '{0}'", nqiSqiEntity.Tech);
      }

      if (nqiSqiEntity.Circle != string.Empty)
      {
          query.AppendFormat("' and CIRCLE = '{0}'", nqiSqiEntity.Circle);
      }

      query.AppendLine( " order by id asc");
  }

Oh, penso che tu voglia che la query sia flessibile per tutte e 3 le colonne ...

  query.AppendLine("select * from K2_NQISQI with (nolock)");

  // if at least 1 of the columns is not empty add a where clause
  if (! (nqiSqiEntity.Month != string.Empty &&
      nqiSqiEntity.Tech != string.Empty  &&
      nqiSqiEntity.Circle != string.Empty)) {

      query.AppendLine (" where ");  // we are going to add on something

      if (nqiSqiEntity.Month != string.Empty)
      {
          query.AppendFormat(" MONTH = '{0}'",nqiSqiEntity.Month);
      }

      if (nqiSqiEntity.Tech != string.Empty)
      {
          query.AppendFormat("' and TECH = '{0}'", nqiSqiEntity.Tech);
      }

      if (nqiSqiEntity.Circle != string.Empty)
      {
          query.AppendFormat("' and CIRCLE = '{0}'", nqiSqiEntity.Circle);
      }
  }

  query.AppendLine( " order by id asc");

Questo è ancora incasinato. Quindi forse il sotto sarà meno confuso, ma ancora, un sacco di if sta succedendo!

Risposta finale

  query.AppendLine("select * from K2_NQISQI with (nolock)");

  // if at least 1 of the columns is not empty add a where clause
  if (! (nqiSqiEntity.Month != string.Empty &&
      nqiSqiEntity.Tech != string.Empty  &&
      nqiSqiEntity.Circle != string.Empty)) {

      query.AppendLine (" where ");  // we are going to add on something

      if (nqiSqiEntity.Month != string.Empty)
      {
          query.AppendFormat(" MONTH = '{0}'",nqiSqiEntity.Month);

          // will there be any "and"ing ?
          if (nqiSqiEntity.Tech != string.Empty || nqiSqiEntity.Circle != string.Empty) 
              query.AppendLine(" and " );
      }

      if (nqiSqiEntity.Tech != string.Empty)
      {
          query.AppendFormat(" TECH = '{0}'", nqiSqiEntity.Tech);

          if (nqiSqiEntity.Circle != string.Empty)
              query.AppendLine(" and " );
      }

      if (nqiSqiEntity.Circle != string.Empty)
      {
          query.AppendFormat(" CIRCLE = '{0}'", nqiSqiEntity.Circle);
      }
  }

  query.AppendLine( " order by id asc");
    
risposta data 18.07.2014 - 16:23
fonte

Leggi altre domande sui tag