2012-05-11 30 views
6

Tôi đang kiểm tra các thông số sắp xếp và xây dựng một loạt các báo cáo if:Tôi làm cách nào để cải thiện mã phân loại này?

if (sortDirection == "ASC") 
{ 
    if (sortBy == "Id") 
     return customerList.OrderBy(x => x.Id).Skip(startIndex).Take(pageSize).ToList(); 
    if (sortBy == "FirstName") 
     return customerList.OrderBy(x => x.FirstName).Skip(startIndex).Take(pageSize).ToList(); 
    if (sortBy == "City") 
     return customerList.OrderBy(x => x.City).Skip(startIndex).Take(pageSize).ToList(); 
} 
else 
{ 
    if (sortBy == "Id") 
     return customerList.OrderByDescending(x => x.Id).Skip(startIndex).Take(pageSize).ToList(); 
    if (sortBy == "FirstName") 
     return customerList.OrderByDescending(x => x.FirstName).Skip(startIndex).Take(pageSize).ToList(); 
    if (sortBy == "City") 
     return customerList.OrderByDescending(x => x.City).Skip(startIndex).Take(pageSize).ToList(); 
} 

Làm thế nào để làm điều này tốt hơn?

+6

Xác định "tốt hơn". Tốt hơn cho cái gì? – Oded

+1

Bằng cách nào bạn muốn "cải thiện" nó? Nó không hoạt động như dự định? Nó có quá chậm không? Bạn không thích cách mã được cấu trúc? Chúng tôi cần thêm thông tin ở đây. –

+0

Tôi sẽ khuyên bạn nên sử dụng LINQ thành phần. Xem http://stackoverflow.com/questions/5881107/how-can-i-build-entity-framework-queries-dynamically/5882243#5882243 – Euphoric

Trả lời

8

riêng đặt hàng của bạn và phần còn lại của các truy vấn - những phần giống nhau cho mỗi truy vấn mà bạn không cần phải lặp lại trong codebase của bạn (giữ nó DRY):

var query = customerList; 

if (sortDirection == "ASC") 
{ 
    if (sortBy == "Id") 
     query = query.OrderBy(x => x.Id); 
    ///and so on 
} 

query = query.Skip(startIndex).Take(pageSize).ToList(); 
+0

Vẫn còn rất nhiều bản mẫu cho tất cả các lĩnh vực, sẽ không phản ánh được nhiều sạch hơn? Hãy tưởng tượng nếu anh ta có 50 trường! :) – mattytommo

+0

@NiklasB. Đó sẽ là vấn đề, bởi vì OrderBy là chung chung và lambda có loại khác nhau cho mỗi tài sản. Trừ khi bạn muốn chuyển đổi nó thành đối tượng ở khắp mọi nơi. – Euphoric

+0

@mattytommo: Điều đó chắc chắn có thể và gọn gàng nếu đây là bộ sưu tập trong bộ nhớ – BrokenGlass

2

Sử dụng phản xạ :)

customerList = (sortDirection == "ASC") 
    ? customerList 
     .OrderBy(x => x.GetType().GetProperty(sortBy).GetValue(x, null)) 
     .Skip(startIndex) 
     .Take(pageSize) 
     .ToList() 
    : customerList 
     .OrderByDescending(x => x.GetType().GetProperty(sortBy).GetValue(x, null)) 
     .Skip(startIndex) 
     .Take(pageSize) 
     .ToList(); 
1

Có vẻ như bạn chỉ muốn đặt hàng theo tên thuộc tính dưới dạng chuỗi. Trong trường hợp đó, điều này là thực sự đã giải quyết bằng cách sử dụng "Dynamic LINQ":

Dynamic LINQ OrderBy on IEnumerable<T>

Hãy nhìn vào câu trả lời của câu hỏi này và nó sẽ cung cấp cho bạn với mẫu mã để giải quyết vấn đề của bạn.

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