2011-11-19 21 views
5

Tôi cần sắp xếp theo ngày nhưng ngày được lưu dưới dạng văn bản trong cơ sở dữ liệu. Tôi đang sử dụng LINQ cho các thực thể để thực hiện các truy vấn.LINQ: Sắp xếp theo ngày khi được lưu dưới dạng văn bản

Cách cơ sở dữ liệu được thiết kế, không thể thay đổi cột thành cột ngày vì nhiều loại dữ liệu khác nhau nằm trong cột đó. Có một cột descriminator tên là type vì vậy tôi sẽ biết loại hàng cụ thể là gì.

+0

Bạn muốn làm gì với các giá trị không phải ngày? Làm rơi chúng? – Otiel

+0

Trong truy vấn của tôi, tôi sẽ chỉ chọn giá trị ngày vì tôi sẽ có loại trong cột khác cho tôi biết loại cột dữ liệu là – Luke101

+1

@ Luke101 trước tiên lấy tất cả bản ghi từ cơ sở dữ liệu vào danh sách rồi thực hiện thao tác trên danh sách đó (như sắp xếp ...) –

Trả lời

2

Bạn có thể thêm cột được tính toán cho bảng sẽ chuyển đổi các chuỗi đó thành ngày khi phân biệt đối xử của bạn có giá trị cụ thể (ở đây tôi vừa mới sử dụng 'date').

ALTER TABLE Foo 
ADD trueDate AS 
    CASE 
     WHEN type = 'date' THEN CONVERT(date, 'mixedColumn', 101) 
     ELSE NULL 
    END 
PERSISTED 

Nếu bạn có thông tin thời gian, sau đó date nên datetime trong CONVERT() chức năng.

Ngoài ra, 101 là mã kiểu cho biết định dạng mong muốn là MM/dd/yyyy. Nếu bạn có điều gì đó khác, hãy tham khảo: http://msdn.microsoft.com/en-us/library/ms187928.aspx, nhưng lưu ý rằng nếu bạn sử dụng kiểu dưới 100, cụm từ của bạn sẽ được coi là không xác định và bạn không thể làm cột được tính PERSISTED, vì vậy chuyển đổi sẽ được thực hiện ngay lập tức với mỗi truy vấn (bạn không muốn điều đó).

Cột được tính sẽ tự cập nhật khi giá trị hàng thay đổi; nếu không thì các giá trị được duy trì và có thể truy vấn giống như trong bất kỳ cột nào khác. Không cần kích hoạt.

+0

Wow..nice. Một điều nữa. Tôi có thể đặt chỉ mục trên cột đó không. Tôi sẽ lưu trữ ngày, số nguyên, chuỗi và các loại dữ liệu khác. Tôi muốn lập chỉ mục cột với các kiểu dữ liệu khác nhau. điều này có thể không? – Luke101

+0

@ Luke101 Cột với các kiểu dữ liệu khác nhau có thể được lập chỉ mục, nhưng sẽ chỉ được lập chỉ mục dưới dạng varchar. Để rõ ràng, cột được tính toán là cột * được thêm vào * chỉ chứa các ngày mà người phân biệt đối xử biểu thị ngày tháng và ngược lại. Bạn có thể tạo các chỉ mục trên cột được tính như mô tả ở đây: http://msdn.microsoft.com/en-us/library/ms189292.aspx – Jay

0

Nếu tất cả các hàng của bạn chứa ngày sử dụng cùng một định dạng ngày bạn có thể chỉ cần đặt hàng theo giá trị chuỗi của chúng. Nhưng vì định dạng ngày phổ biến nhất (tức là tiếng Anh) KHÔNG bắt đầu với năm, điều đó có thể chứng minh có vấn đề.

Tùy chọn A .: Sắp xếp trong bộ nhớ.

var records = db.YourTable.Where(o=>o.Discriminator =="date").AsEnumerable() 
    .Select(o=>new {Entity= o, Date=DateTime.Parse(o.YourColumn)}) 
    .OrderBy(o.Date).Select(o=>o.Entity); 

ĐỪNG làm điều này nếu bạn có rất nhiều hàng, hoặc nếu bạn phải, ít nhất có đoan để cache kết quả ra lệnh ...

Lựa chọn B .: Cơ sở dữ liệu ma thuật
Thêm cột bổ sung vào DB của bạn, đặt ngày THAT (không thể thực hiện) và cập nhật nếu ngày phân biệt đối xử. Bạn có thể cập nhật nó trong một (DML) Kích hoạt hoặc từ C# ...
HOẶC nếu việc chuyển đổi rất đơn giản bạn có thể xây dựng một xem ra khỏi nó ...

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