2009-10-20 10 views
8

Questo esempio di codice seguente è preso a prestito da MSDN here. Non sto ottenendo query.CopyToDataTable() disponibile nel mio codice. (vedi la riga commentata nel mio codice seguente).Perché non ottengo .CopyToDataTable() in Linq Query()

public static bool SetPhysicianAsNotonServer(DataTable dt) 
     { 
      DataTable dtPhysicianServer = dt; 
      DataTable dtPhysicianClient = GetPhysicianClient(); 

      var query = 
       from SPhysician in dtPhysicianServer.AsEnumerable() 
       join CPhysician in dtPhysicianClient.AsEnumerable() 
       on SPhysician.Field<string>("PhysicianNumber") equals 
        CPhysician.Field<string>("PhysicianNumber") 
       select new 
       { 
        PhysicianNumber = CPhysician.Field<string>("PhysicianNumber") 
       }; 

      DataTable FilterDt = query; //query.CopyToDataTable(); 
      //YET TO DO CODE HERE 
      return true; 
     } 
+0

Se si tenta di chiamare 'CopyToDataTable()' quale messaggio di errore ricevi? –

risposta

20

L'istruzione di selezione restituisce una sequenza di stringhe (IEnumerable<string> o IQueryable<string>), non una sequenza di DataRows. CopyToDataTable() è disponibile solo su IEnumerable<T> dove T è o deriva da DataRow.

Invece di select new { ... } - che sarà solo si ottiene una nuova sequenza di quel tipo, provare:

select CPhysician; 

Che dovrebbe restituire la sequenza desiderata di righe CPhysician.

Modifica Se si desidera convertire una T non DataTable di derivazione ad un DataTable, MSDN ha una classe di esempio che riflette qualsiasi tipo ed esegue la conversione.

http://msdn.microsoft.com/en-us/library/bb669096.aspx

+0

@anonymous perché il DV? –

+1

+1 per l'unica spiegazione completa e accurata (mentre potrebbe essere necessario fare riferimento a DataSetExtensions, che non risolverà il problema). –

+0

Suona bene. Ma per favore dimmi come lo sistemo.Se faccio questo IEnumerable query = // l'intero codice sopra, Non mi permette di mettere Join in Linq Query. – Jango

5

Esiste in uno spazio dei nomi specifico lo state importando?

System.Data.DataTableExtensions.CopyToDataTable() 

confermano inoltre l'aggiunta di questo riferimento

System.Data.DataSetExtensions 
+1

DataTable.AsEnumerable fallirebbe anche se questo non fosse incluso. –

+1

questa è la risposta giusta – Abra001

2

È necessario fare riferimento all'assemblea System.Data.DataSetExtensions e utilizzare lo spazio dei nomi System.Data.

+0

Non è un problema di riferimento. L'assembly DataSetExtensions è già lì. – Jango

0

Avete fatto riferimento System.Data.DataSetExtensions montaggio? Questo metodo di estensione è definito lì.

0

Navigazione ulteriormente in MSDN in linea mi porta a questa pagina: http://msdn.microsoft.com/en-us/library/system.data.datatableextensions.aspx

si dice la sua nel namespace System.Data (using System.Data) ed è necessario fare riferimento alla System.Data.DataSetExtensions.dll.

+0

Se questo fosse il problema, le chiamate a AsEnumerable fallirebbero, vero? –

+0

Immagino che tu abbia ragione. Ho fatto solo un po 'di ricerche e nessun VS per testare ... E vedo che @Rex M probabilmente ha la risposta giusta a questa domanda :-) –

3

Penso che sia perché si sta creando un tipo anonimo per contenere l'oggetto Field. Prova questo:

var query = from SPhysician in dtPhysicianServer.AsEnumerable() 
       join CPhysician in dtPhysicianClient.AsEnumerable() 
       on SPhysician.Field<string>("PhysicianNumber") equals 
        CPhysician.Field<string>("PhysicianNumber") 
       select CPhysician; 

    DataTable FilterDt = query.CopyToDataTable(); 

Definizione CopyToDataTable<T>:

public static DataTable CopyToDataTable<T>(
    this IEnumerable<T> source 
) 
where T : DataRow 

Allora, cosa si seleziona con la query deve essere di tipo IEnumerable<T> dove T estende DataRow

+0

no non ha funzionato. Stessa cosa ... Non riesco a vedere .CopyToDataTable() – Jango

+0

Hai provato a fare riferimento a DataSetExtensions come altri hanno menzionato? –