2010-01-30 4 views
3

У меня есть требование для преобразования LINQ в DataTable.Linq to DataSet - обработка нулевых значений

я украл следующий метод расширения от StackOverflow:

public static DataTable ToDataTable<T>(this IEnumerable<T> items) 
     { 
      var tb = new DataTable(typeof(T).Name); 
      PropertyInfo[] props = 
      typeof(T).GetProperties(BindingFlags.Public 
            | BindingFlags.Instance); 

      foreach (var prop in props) 
      { 
       tb.Columns.Add(prop.Name, prop.PropertyType); 
      } 

      foreach (var item in items) 
      { 
       var values = new object[props.Length]; 
       for (var i = 0; i < props.Length; i++) 
       { 
        values[i] = props[i].GetValue(item, null); 
       } 

       tb.Rows.Add(values); 
      } 
      return tb; 
    } 

Если таблица содержит нулевые значения он бросает исключение. (т.е.)

DataSet does not support System.Nullable<> 

Comission (десятичный тип) столбец содержит нулевое значение)

на

tb.Columns.Add(prop.Name, prop.PropertyType); 

Как это исправить?

ответ

3

Вот развалюха версия:

public static DataTable ToDataTable<T>(this IEnumerable<T> items) { 
    DataTable table = new DataTable(typeof(T).Name); 
    PropertyInfo[] props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance); 

    foreach (var prop in props) { 
     Type propType = prop.PropertyType; 

     // Is it a nullable type? Get the underlying type 
     if (propType.IsGenericType && propType.GetGenericTypeDefinition().Equals(typeof(Nullable<>))) 
      propType = new NullableConverter(propType).UnderlyingType; 

     table.Columns.Add(prop.Name, propType); 
    } 

    foreach (var item in items) { 
     var values = new object[props.Length]; 
     for (var i = 0; i < props.Length; i++) 
      values[i] = props[i].GetValue(item, null); 

     table.Rows.Add(values); 
    } 

    return table; 
} 

Edit: Модифицированная мой код немного, тестировал, он работает ! :)

+0

Большое спасибо – Dhina

0

Вы можете проверить значение null, а затем сохранить DBNull.Value в качестве значения. Существует MSDN article about null values, что специально указывает на отсутствие поддержки Nullable <> Datasets.

Где у вас есть

values[i] = props[i].GetValue(item, null); 

делают

var value = props[i].GetValue(item, null); 
values[i] = value ?? ((object)DBNull.Value); 
+1

Вы также можете использовать обнуляемый opperator ?? поэтому код будет 'values ​​[i] = value ?? (объект) DBNull.Value; ' –

+0

Большое спасибо – Dhina

+0

@Scott: хороший звонок. Я обновил его. – TheDon

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