2012-02-16 39 views
5

Tôi có một lớp trong LINQ truy vấn bảng db như thế này và câu hỏi là: Làm cách nào để xuất dữ liệu đó sang csv? Tôi đã thử liên kết đề xuất và tôi đang sử dụng linq2csv và vẫn muốn biết làm thế nào để có được cột theo thứ tự của họ? cảm ơn!Xuất sang csv - LINQ truy vấn

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); 

Trả lời

2

Để kiểm soát thứ tự sắp xếp bạn phải xác định một lớp học với các thuộc tính như

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; } 
} 

Sau đó, bạn thay đổi truy vấn LINQ của bạn để sử dụng lớp này, ví dụ như

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

Tôi đã thử điều đó, nhưng tôi có trường ngày và giờ không chấp nhận nó. Tôi có nó trong lớp được định nghĩa là dateTime và trong sql là ngày tháng và thời gian quá. Bất kỳ ý tưởng nào. Trân trọng – FAA

+0

Nếu cột sql cho phép null thì bạn có thể cần sử dụng DateTime? thay vì DateTime. Nếu điều đó không giúp được gì thì bạn bị lỗi gì? – sgmoore

+0

nó là datetime trên cả hai. Ngoài ra, lỗi là: DateTaken = u.DateTaken <--- connot implicity chuyển đổi từ datetime thành datetime. cảm ơn – FAA

1

Kể từ khi bạn đã quen thuộc với LINQ, tôi đã sử dụng LINQ2CSV Matt Perdeck của (http://www.codeproject.com/Articles/25133/LINQ-to-CSV-library) trước và nó làm cho cuộc sống của tôi dễ dàng hơn rất nhiều.

+0

Tôi đang tìm một nút mà người dùng nhấn vào nó, sau đó nó nhắc lưu tệp vào máy tính của họ. Ngoài ra còn có một cách dễ dàng hơn để làm điều này. cảm ơn – FAA

+0

Bất kỳ nhận xét nào khác! – FAA

+0

Tôi đã sử dụng Linq2csv đó và sử dụng nó theo cách này (như được cập nhật trên bài đăng đầu tiên). Nhưng tôi nhận được đầu ra để csv nhưng thứ tự cột là ngẫu nhiên. bất kỳ ý tưởng nào về cách sửa lỗi này? – FAA

1

LINQtoCSV không giữ gìn thứ tự cột của bạn trừ khi bạn sử dụng thuộc tính [CsvColumn (FieldIndex = 1)] trên tất cả các thuộc tính của bạn. Nhưng ai muốn làm điều đó? Tôi sẽ sử dụng thư viện ServiceStack.Text. Nó bảo quản các đơn đặt hàng cột theo mặc định. Hoạt động như thế này:

chuỗi csv = ServiceStack.Text.CsvSerializer.SerializeToCsv <> (exportData);