2014-02-25 6 views
5

Wie kann ich trasfrom die folgende SQL-Anweisung in Linqwählen Fall in Linq in C#

select AdsProperties.AdsProID, 
     AdsProperties.IsActive, 
     AdsProperties.Name, 
      case 
       when AdsProperties.ControlType =1 then -- TextBox 
        'Textbox' 
       when AdsProperties.ControlType =2 then -- DropDown 
        'Dropdown' 
       when AdsProperties.ControlType =3 then -- ConboBox 
        'ComboBox' 
       else -- RadioButton 
        'RadioButtont' 
      end as ControlType 
    from CLF.utblCLFAdsPropertiesMaster as AdsProperties 

Ich habe versucht, diese

var query = from AdsProperties in db.utblCLFAdsPropertiesMasters 
      select new 
      { 
       AdsProperties.AdsProID, 
       AdsProperties.Name, 
       AdsProperties.IsActive, 
       ControlType = AdsProperties.ControlType == 1 ? (int?)"TextBox" : null, 
       ControlType = AdsProperties.ControlType == 2 ? (int?)"Dropdown" : null, 
       ControlType = AdsProperties.ControlType == 3 ? (int?)"ComboBox" : null,     
       ControlType = AdsProperties.ControlType == 4 ? (int?)"RadioButton" : null) 
      }; 
      dt = query.CopyToDataTableExt(); 

aber ich erhalte diesen Fehler

`an anynomous type cannot have multiple properties with the same name` 

Ich weiß, dass es einfach und einfach sein kann. Da ich jedoch neu in linq bin, habe ich nicht die richtige Erfahrung, um damit umzugehen. Jede Hilfe wäre willkommen. Danke im Voraus.

+1

Sie können eine separate Methode für die switch-Anweisung verwenden und diese der Eigenschaft ControlType.e.g zuweisen. 'ControlType = GetControlType (AdsProperties.ControlType)' –

+1

Warum nicht Enum zu ControlType anstelle von int verwenden? – Alex

+0

Magische Saiten sind böse. – Aron

Antwort

4

Deklarieren Sie ein Array von Strings als:

string[] controls = new string[] {"TextBox","Dropdown","ComboBox","RadioButton"}; 

Ändern Sie bitte Ihre Abfrage, wie unten erwähnt:

var query = from AdsProperties in db.utblCLFAdsPropertiesMasters 
        select new 
        { 
         AdsProperties.AdsProID, 
         AdsProperties.Name, 
         AdsProperties.IsActive, 
         ControlType = AdsProperties.ControlType < controls.Length ? controls[AdsProperties.ControlType-1] : null 
        }; 
     dt = query.CopyToDataTableExt(); 
+0

Nun, ich denke nicht, dass dies der absolut sicherste Weg ist. Was, wenn ein anderer Kontrolltyp mit dem Index 999 hinzugefügt wird? Es ist auch möglich, einen anderen Typ für controlType zu haben, was ist, wenn es nullfähig ist? oder sogar zu einem String-Wert geändert. Ich würde dies als eine Umgehung und nicht als eine Lösung betrachten, da dies zum Scheitern verurteilt ist, wenn in dem System in Zukunft Änderungen vorgenommen werden. –

+0

@ShaktiPrakashSingh: Danke für den Vorschlag. Können Sie meine Antwort jetzt überprüfen? –

1
var query = from AdsProperties in db.utblCLFAdsPropertiesMasters 
        select new 
        { 
         AdsProperties.AdsProID, 
         AdsProperties.Name, 
         AdsProperties.IsActive, 
         ControlType = (AdsProperties.ControlType == 1) ? "TextBox" : 
             (AdsProperties.ControlType == 2) ? "Dropdown" : 
             (AdsProperties.ControlType == 3) ? "ComboBox" : 
             (AdsProperties.ControlType == 4) ? "RadioButton" : "" 
        }; 
     dt = query.CopyToDataTableExt(); 
+0

Dies ist etwas ähnlich zu dem, was ich gepostet habe. Du hast mich um 8 Sekunden geschlagen. ;) –

+0

Ja ich wundere mich, dass StackOver es nicht aufhörte, scheint wie große Verzögerungen auf Servern oder anderswo ... – Cynede

+0

Anyways, +1 für mich in der Zeit zu schlagen. ;) –

1

Sie können den folgenden Code verwenden.

var query = from AdsProperties in db.utblCLFAdsPropertiesMasters 
    select new 
    { 
     AdsProperties.AdsProID, 
     AdsProperties.Name, 
     AdsProperties.IsActive, 
     ControlType = AdsProperties.ControlType == 1 ? "TextBox" : 
      (AdsProperties.ControlType == 2) ? "Dropdown" : 
      (AdsProperties.ControlType == 3) ? "ComboBox" : 
      (AdsProperties.ControlType == 4) ? "RadioButton" : 
      null) 
    }; 
dt = query.CopyToDataTableExt(); 

Auch, wenn Sie es weniger chaotisch machen möchten, können Sie versuchen, Ihren Zustand in einem anderen Verfahren zu setzen und einen Anruf tätigen, wie:

var query = from AdsProperties in db.utblCLFAdsPropertiesMasters 
    select new 
    { 
     AdsProperties.AdsProID, 
     AdsProperties.Name, 
     AdsProperties.IsActive, 
     ControlType = GetControlType(AdsProperties.ControlType) 
    }; 
dt = query.CopyToDataTableExt(); 

Und Ihre GetControlType wird wie etwas sein:

private string GetControlType(int controlIndexOrWhatever) 
{ 
    switch(controlIndexOrWhatever) 
    { 
     case 1: return "TextBox"; 
     case 2: return "DropDown"; 
     case 3: return "ComboBox"; 
     case 4: return "RadioButton"; 
     default: return null;    
    } 
} 

Aber es ist nicht getestet und funktioniert nicht mit LINQ zu Entitäten. Ich denke, es könnte für LINQ to SQL funktionieren. Wenn es irgendwelche Syntaxprobleme gibt, schreiben Sie einfach den Code, ohne VS zu überprüfen.

+0

dynamische typecast string zu nullable int, bitte erklären, was erwartest du? – Cynede

+0

Mein schlechtes, kopierte einfach den OPs Code. Ich bin mir nicht sicher, was er damit gemeint hat, aber ich habe eine Lösung für das Problem gefunden. –

+1

Funktioniert nicht mit LinqToSQL. Es ist kein Ausdruck. – Aron