2012-01-23 33 views
5

Tôi đang cố gắng lấy danh sách các ngày từ bảng của tôi, chứa một số giá trị DateTime trong một cột có tên là StartTime. Người tiền nhiệm của tôi đã sử dụng SQL sau:Chuỗi con của một DateTime với các phần mở rộng LINQ to Sql

SELECT DISTINCT SUBSTRING(CONVERT(VARCHAR(50), StartTime, 120), 1, 10) 

Kết quả này liệt kê một danh sách riêng biệt về định dạng "yyyy-MM-dd" cho mỗi hàng trong bảng. Tôi đang cố gắng để chuyển đổi này để LINQ-to-SQL bằng cách làm như sau:

query.Select(o => o.StartTime.ToString("yyyy-MM-dd")).Distinct() 

Tuy nhiên kết quả này trong một lỗi "Phương pháp 'System.String ToString (System.String)' không có bản dịch được hỗ trợ để SQL . "

Làm cách nào tôi có thể thực hiện chuỗi/chuyển đổi này bằng LINQ-to-SQL?

Cảm ơn!

Trả lời

5

Thay vì dựa vào xử lý chuỗi, bạn có thể xử lý này qua DateTime properties supported in LINQ to SQL:

var results = query.Select(o => o.StartTime.Date).Distinct(); 

Nếu bạn muốn xem điều này như một chuỗi, sau đó, bạn có thể sử dụng LINQ to Objects để chuyển đổi các kết quả:

var stringResults = results.AsEnumerable().Select(d => d.ToString("yyyy-MM-dd")); 
3

tôi sẽ làm:

query.Select(o => o.StartTime.Date) 
    .Distinct() // Runs on the database 
    .AsEnumerable() // Convert to local sequence 
    .Select(date => date.ToString("yyyy-MM-dd")) // Runs on the client 

Các DateTime.Date tài sản (dải phần phụ ngày ra) được hỗ trợ trong LINQ to SQL, vì vậy tất cả mọi thứ khác hơn ngày-định dạng sẽ chạy trên cơ sở dữ liệu.

+0

Điều đó sẽ khác biệt với giá trị ngày giờ đầy đủ, không phải trên phần ngày. –

+0

@Jon: Không, nó sẽ chỉ khác biệt với phần Ngày. Lưu ý ánh xạ tới DateTime.Date trên mệnh đề Select. – Ani

+0

Vâng, tôi chỉ đơn giản là đọc sai nó ở đó. –

Các vấn đề liên quan