2012-02-16 1 views
5

Ho una classe in linq che richiama la tabella db in questo modo e la domanda è: Come esportare quei dati in csv? Ho provato il collegamento suggerito e sto usando linq2csv e voglio ancora sapere come ottenere la colonna dal loro ordine? Grazie!Esporta in csv - query Linq

var usr = from usr in db.User 
select new { usr.UserName, usr.Dept, usr.Name) 
MainListView.DataSource = usr; 
MainListView.DataBind(); 

CsvFileDescription outputFileDescription = new CsvFileDescription 
       { 
        SeparatorChar = ',', 
        FirstLineHasColumnNames = true, 
        FileCultureName = "en-US" 
       }; 

       CsvContext cc = new CsvContext(); 
       string finalPath = mypath + "usr_" + DateTime.Now.ToString ("yyyyMMddhhmmssfff") + ".csv"; 
       cc.Write(usr, finalPath, outputFileDescription); 

risposta

2

Al fine di controllare l'ordinamento è necessario definire una classe con gli attributi come

public class User 
{ 
    [CsvColumn(FieldIndex = 1)] 
    public string UserName { get; set; } 

    [CsvColumn(FieldIndex = 2)] 
    public string Dept { get; set; } 

    [CsvColumn(FieldIndex = 3)] 
    public string Name { get; set; } 
} 

Poi si cambia la query LINQ per utilizzare questa classe, ad esempio

string mypath = @".\"; 

var usr = (from u in db.User select new User 
       { 
        UserName = u.UserName, 
        Dept  = u.Dept , 
        Name  = u.Name 
       } 
     ); 

CsvFileDescription outputFileDescription = new CsvFileDescription 
    { 
     SeparatorChar = ',', 
     FirstLineHasColumnNames = true, 
     FileCultureName = "en-US" 
    }; 

CsvContext cc = new CsvContext(); 
string finalPath = mypath + "usr_" + DateTime.Now.ToString("yyyyMMddhhmmssfff") + ".csv"; 
cc.Write(usr, finalPath, outputFileDescription); 
+0

L'ho provato, ma ho il campo data e ora che non lo accetterò. Ce l'ho nella classe definita come dateTime e in sql è anche data e ora. Qualche idea. Cordiali saluti – FAA

+0

Se la colonna sql consente i valori null, potrebbe essere necessario utilizzare DateTime? invece di DateTime. Se questo non aiuta, allora quale errore ottieni? – sgmoore

+0

è datetime su entrambi. Anche l'errore è: DateTaken = u.DateTaken <--- connot implicity convert da datetime a datetime. grazie – FAA

1

Dal momento che siete già familiarità con LINQ, ho usato LINQ2CSV di Matt Perdeck (http://www.codeproject.com/Articles/25133/LINQ-to-CSV-library) prima e 'fatta la mia vita molto più facile.

+0

Sto cercando un pulsante in cui l'utente preme su di esso, quindi richiede di salvare il file sul proprio computer. C'è anche un modo più semplice per farlo. grazie – FAA

+0

Qualsiasi altro commento! – FAA

+0

Ho usato quel Linq2csv e l'ho usato in questo modo (come aggiornato sul primo post). Ma ottengo l'output in csv ma ​​l'ordine delle colonne è casuale. qualche idea su come risolvere questo problema? – FAA

1

LINQtoCSV non preserva l'ordine delle colonne a meno che non si utilizzi l'attributo [CsvColumn (FieldIndex = 1)] su tutte le proprietà. Ma chi lo vuole fare? Vorrei usare la libreria ServiceStack.Text. Conserva gli ordini di colonne per impostazione predefinita. Funziona così:

string csv = ServiceStack.Text.CsvSerializer.SerializeToCsv <> (exportData);