2013-08-06 5 views
1

Я использую следующий LINQ для разбора набор данных, который я вернулся:Linq запросов с динамическим типом

row.Field<long?>("id").HasValue == false && 

Проблема я бегу в том, что, когда набор данных получается из Sql Server, поле необходимо проанализировать с помощью <int?>, и когда он будет получен из Oracle, его необходимо проанализировать как <long?>. Есть ли способ создать переменную, которую я могу передать методу .Field для динамического задания этого типа данных? Я хотел бы иметь что-то вроде этого:

Type T = IsSqlServer ? typeof(int?) : typeof(long?); 
.... 
row.Field<T>("id").HasValue == false && 

Заранее спасибо!

+0

Нельзя использовать ключевое слово 'dynamic'? – MoonKnight

+0

@ Killercam Это сработало! Если вы ответите, я помету его, когда смогу. – mrK

+0

Прохладный. Сделаю. Спасибо. – MoonKnight

ответ

1

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

Надеюсь, это поможет.

3

Вы можете либо использовать отражение (не рекомендуется) или просто использовать тройной оператор:

!(IsSqlServer ? row.Field<int?>("id").HasValue : row.Field<long?>("id").HasValue) 
+0

Я искал более чистого решения, чем это. У меня есть, вероятно, 100 способов использования этого кода, над которым я работаю, и это сделает его намного менее удобочитаемым. – mrK

+0

@mrK Затем вы можете упаковать его в метод. Я мог бы показать вам отражение, но это было бы уродливо. –

+0

На самом деле у @Killercam было предложение в комментариях, которые отлично работали. Спасибо за вашу помощь. – mrK

1

Вот метод расширения:

public static class DataRowHelpers 
{ 
    private static readonly Dictionary<Type, MethodInfo> FieldSpecialized = new Dictionary<Type, MethodInfo>(); 

    public static bool FieldHasValue(this DataRow row, Type type, string column) 
    { 
     MethodInfo fieldSpecialized; 

     if(!FieldSpecialized.TryGetValue(type, out fieldSpecialized)) 
     {  
      var extensions = typeof(DataRowExtensions); 
      var fieldGeneric = extensions.GetMethod("Field", 
                new[] { typeof(DataRow), typeof(string) }); 
      fieldSpecialized = fieldGeneric.MakeGenericMethod(type); 

      FieldSpecialized.Add(type, fieldSpecialized); 
     } 


     return fieldSpecialized.Invoke(null, new object[] { row, column }) != null; 
    } 
} 

Использование:

var type = IsSqlServer ? typeof(int?) : typeof(long?); 

var predicate = row.FieldHasValue(type, "id"); 
Смежные вопросы