2014-02-25 6 views
5

Как я могу trasfrom следующую инструкцию SQL в LINQвыберите случай LINQ в 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 

Я попытался это

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(); 

, но я получаю эту ошибку

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

Я знаю, что это может быть легко и просто. Однако, будучи новым в linq, у меня нет практического опыта, чтобы справиться с этим. Любая помощь будет оценена по достоинству. Заранее спасибо.

+1

Вы можете использовать отдельный метод для оператора switch и назначить его свойству ControlType.e.g. 'ControlType = GetControlType (AdsProperties.ControlType)' –

+1

Почему бы не использовать Enum для ControlType вместо int? – Alex

+0

Волшебные струны злы. – Aron

ответ

4

Объявите массив строк как:

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

Изменить запрос, как указано ниже:

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

Ну, я не думаю, что это самый надежный способ сделать это. Что делать, если добавлен другой тип управления с индексом 999? Кроме того, для типа controlType может быть другой тип, что, если он имеет значение NULL? или даже изменить на строковое значение. Я рассматривал бы это как работу, а не решение, поскольку это неизбежно потерпит неудачу, если в будущем будут внесены изменения в систему. –

+0

@ShaktiPrakashSingh: Спасибо за предложение. Не могли бы вы пересмотреть мой ответ сейчас? –

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

Это несколько похоже на то, что я разместил. Вы избили меня на 8 секунд. ;) –

+0

Да, я удивляюсь, что StackOver не остановил его, похоже, серьезные задержки на серверах или где-то еще ... – Cynede

+0

Anyways, +1 за избиение меня во времени. ;) –

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" : 
      null) 
    }; 
dt = query.CopyToDataTableExt(); 

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

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

И ваш GetControlType будет что-то вроде:

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;    
    } 
} 

Но опять же, он не протестирован и не работает с LINQ объектами. Я думаю, что это может работать для LINQ to SQL. Не обращайте внимания на проблемы синтаксиса, если они есть, просто написал код без проверки на VS.

+0

динамическая строка typecast до nullable int, пожалуйста, объясните, что вы ожидаете? – Cynede

+0

Мой плохой, просто скопировал код OPs. Я не уверен, что он имел в виду делать это, но несколько разрешил проблему. –

+1

Не будет работать с LinqToSQL. Это не выражение. – Aron

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