2014-08-28 1 views
0

я exacly скопировать из MSDN, но следующий код дает мне ошибкуошибка в связывании DataTable в базу данных LINQ

The type 'AnonymousType#1' cannot be used as type parameter 'T' in the generic type or method 
'System.Data.DataTableExtensions.CopyToDataTable<T> (System.Collections.Generic.IEnumerable<T>, 
System.Data.DataTable, System.Data.LoadOption)'. There is no implicit reference conversion from 
'AnonymousType#1' to 'System.Data.DataRow'.  

мой код:

Item[] items = new Item[] 
           { 
            new Book{Id = 1, Price = 13.50, Genre = "Comedy", Author = "Gustavo Achong"}, 
            new Book{Id = 2, Price = 8.50, Genre = "Drama", Author = "Jessie Zeng"}, 
            new Movie{Id = 1, Price = 22.99, Genre = "Comedy", Director = "Marissa Barnes"}, 
            new Movie{Id = 1, Price = 13.40, Genre = "Action", Director = "Emmanuel Fernandez"} 
           }; 

      // Create a table with a schema that matches that of the query results.    
      DataTable dt1 = new DataTable(); 
      dt1.Columns.Add("Price", typeof(int)); 
      dt1.Columns.Add("Genre", typeof(string)); 

      var query = from i in items 
         where i.Price > 9.99 
         orderby i.Price 
         select new { i.Price, i.Genre }; 

      query.CopyToDataTable(dt1, LoadOption.PreserveChanges); 

как сделать это workabe?

+0

Попробуйте переименовать расширение (f.e. 'CopyAnyToDataTable'), может быть, это именование conflicht с' DataTableExtensions.CopyToDataTable' методы расширения. –

+0

@TimSchmelter Аргумент типа не должен быть совместим с DataRow, см. Ограничение на T: http://msdn.microsoft.com/en-us/library/bb396189(v=vs.110).aspx –

+0

@ Selman22: i предположим, что OP использует класс 'ObjectShredder' Microsoft, который позволяет использовать' CopyToDataTable' с любым типом. http://msdn.microsoft.com/en-us/library/bb669096(v=vs.110).aspx –

ответ

1

Попробуйте этот код, поместите его в статическом вспомогательном классе, и это позволит вам вызывать ToDataTable(); на предметах.

public static DataTable ToDataTable<T>(this IEnumerable<T> data) 
    { 
     DataTable dt = new DataTable(); 
     foreach (var prop in data.First().GetType().GetProperties()) 
     { 
      dt.Columns.Add(prop.Name); 
     } 

     foreach (T entry in data) 
     { 
      List<object> newRow = new List<object>(); 
      foreach (DataColumn dc in dt.Columns) 
      { 
       var val = entry.GetType().GetProperty(dc.ColumnName).GetValue(entry, null); 
       newRow.Add(val); 
      } 
      dt.Rows.Add(newRow.ToArray()); 
     } 
     return dt; 
    } 
+0

Как это назвать? – decoder

+0

CustomLINQtoDataSetMethods.ToDataTable <> (запрос); как ???? – decoder

+1

@decoder Если вы указали выше в отдельном статическом классе, вы можете вызвать i так, чтобы 'DataTable dt1 = query.ToDataTable();' – Catwood

1

Я exacly скопировать из MSDN ...

Вы пытаетесь реализовать Microsofts ObjectShredder<T> -класса, который позволяет использовать CopyToDataTable с любым типом?

Затем попробуйте переименовать расширение (f.e. CopyAnyToDataTable), это может быть конфликт имен с помощью метода DataTableExtensions.CopyToDataTable расширения, который позволяет только DataRow с.

Некоторое время назад я также имел эту проблему, вот подобный вопрос:

Exception using CopyToDataTable with "new {..}" LINQ query

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