2013-06-13 2 views
0

я использую ниже кодЗаливка Datatable из Linq запроса

IEnumerable<DataRow> query = from c in at.appointmentcalendars.AsEnumerable() 
          select c; 

DataTable dt = query.CopyToDataTable(); 

Но я получаю ошибку ниже

Не удается неявно преобразовать Type 'System.Collections.Generic.IEnumerable<appointmentcalendar>' в 'System.Collections.Generic.IEnumerable<System.Data.DataRow>'. явное преобразование существует (вы пропали без вести бросок?)

+0

Ошибка говорит вам, что ваш classcalendar класс не может быть преобразован в DataRow. Вам нужно создать функцию, которая будет делать это преобразование. – brianestey

+0

system.data.linq.table –

+0

не могли бы вы помочь мне с тем же, я новичок в linq ... я думал, что будет легко получить данные из запроса linq в datatable –

ответ

7

Поскольку запрос возвращает IEnumerable типа DataRow, вы должны указать, что нужно вставлять в datatable, в данном случае DataRow.

DataTable dt = query.CopyToDataTable<DataRow>(); 

Если вы использовали

var query = //linq query of what you need for new datatable.... 
DataTable dt = query.CopyToDataTable(); 

Ваше имя таблицы дт так выбрать то, что вам нужно от исходного DT

var query = from c in db.something 
      where c.othersomething == "onlyyouknow" 
      orderby c.othersomething 
      select new { NewObject = c.othersomething }; 

DataTable MyDataTable = new DataTable(); 
myDataTable.Columns.Add(
    new DataColumn() 
    { 
     DataType = System.Type.GetType("System.String"),//or other type 
     ColumnName = "Name"  //or other column name 
    } 
); 

foreach (var element in query) 
{ 
    var row = MyDataTable.NewRow(); 
    row["Name"] = element.NewObject; 
    myDataTable.Rows.Add(row); 
} 
+0

Это сработало Спасибо! ! –

+0

Вы добрый, рад, что он работал – terrybozzio

0

at.appointmentcalendars не DataTable. Таким образом, ваш запрос возвращает коллекцию объектов appointmentcalendar, которые нельзя отнести к коллекции DataRow.

Вы должны использовать CopyToDataTable метод из статьи MSDN How to: Implement CopyToDataTable Where the Generic Type T Is Not a DataRow:

IEnumerable<appointmentcalendar> query = at.appointmentcalendars.AsEnumerable(); 
DataTable dt = query.CopyToDataTable(); 

По умолчанию CopyToDataTable() метод работает только с коллекцией DataRow объектов, так что вы не можете использовать его здесь.

0

Если кто-то нужно решение в VB.net и с функциями агрегации:

Dim MyDataTable As DataTable = New DataTable 
    MyDataTable.Columns.Add("ProviderName", GetType(String)) 
    MyDataTable.Columns.Add("TotalNumSale", GetType(Integer)) 
    MyDataTable.Columns.Add("TotalValSale", GetType(Double)) 

    Dim testquery = (From p In adviceProductData _ 
             Where p.IsOffPanel = False _ 
            Group By p.ProviderName _ 
            Into _ 
            totalNoOfSale = Sum(p.NoOfSales), _ 
            totalValueOfSale = Sum(p.ValueOfSales) 
            Select New With { 
             .ProvName = ProviderName, 
             .TotSale = totalNoOfSale, 
             .TotVal = totalValueOfSale 
             }).ToList() 

    Dim item 
    For Each item In testquery 
     Dim row = MyDataTable.NewRow() 
     row("ProviderName") = item.ProvName 
     row("TotalNumSale") = item.TotSale 
     row("TotalValSale") = item.TotVal 
     MyDataTable.Rows.Add(row) 
    Next 
+1

, чтобы поделиться своими знаниями, вы можете создать свой собственный [вопрос + ответ] (http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and- answer-your-own-questions /) (это нормально на SO) и связать его с этим – dk14

0
DataTable getListRow(DataTable dt, int intSndBCode, int intPostManSCode) 
    { 
     IEnumerable<DataRow> results = (from MyRows in dt.AsEnumerable() 
         where 
         MyRows.Field<int>("m_sndBCode") == intSndBCode 
         && 
         MyRows.Field<int>("m_postManSCode") == intPostManSCode 
         select MyRows); 
     DataTable dtNew = results.CopyToDataTable(); 
     return dtNew; 
    } 
Смежные вопросы