2010-06-20 8 views
5

Cách đặt hàng theo biến Cột vì tôi có một menu thả xuống trên trang và tôi muốn hiển thị lưới theo thứ tự được chọn trong danh sách thả xuống này, ví dụ: Giá, Mã, xếp hạng, mô tả v.v. và tôi không muốn viết một truy vấn riêng cho mỗi cột.muốn truy vấn để đặt hàng theo biến trong truy vấn LINQ

from lm in lDc.tbl_Products 
where lm.TypeRef == pTypeId 
orderby lm.Code ascending 
select new; 
+0

Xem thêm: http://stackoverflow.com/questions/41244/dynamic-linq-orderby –

Trả lời

6

Giả sử bạn muốn thực hiện sắp xếp thông qua SQL thì bạn sẽ cần phải chuyển vào cột/loại sắp xếp. Truy vấn được hoãn lại cho đến khi bạn thực sự làm các lựa chọn để bạn có thể xây dựng các truy vấn trong các bước và một khi bạn đang thực hiện thực hiện nó như vậy:

// Do you query first. This will NOT execute in SQL yet. 
var query = lDC.tbl_Products.Where(p => p.TypeRef == pTypeId); 

// Now add on the sort that you require... you could do ascending, descending, 
// different cols etc.. 
switch (sortColumn) 
{ 
    case "Price": 
     query = query.OrderBy(q => q.Price); 
     break; 
    case "Code": 
     query = query.OrderBy(q => q.Code); 
     break; 
    // etc... 
} 

// Now execute the query to get a result 
var result = query.ToList(); 

Nếu bạn muốn làm điều đó bên ngoài của SQL sau đó chỉ cần có được một cơ bản kết quả là không phân loại và sau đó áp dụng một OrderBy vào kết quả dựa trên các tiêu chí sắp xếp mà bạn cần.

+0

và những gì nếu tôi cũng có một số tham gia trong truy vấn ?? – Azhar

+0

@Azhar chỉ thêm 'Tham gia' sau phần' Where' và mọi thứ khác sẽ hoạt động giống nhau. 'Join' sẽ chỉ tham gia vào một' IQueryable' khác. – Kelsey

0

Bạn có thể "xây dựng" truy vấn LINQ theo các bước riêng biệt.

Tạo truy vấn cơ sở của bạn để trả lại thông tin chưa được phân loại. Truy vấn này sẽ không được thực hiện cho đến khi bạn thử và liệt kê các kết quả.

var data = from lm in lDc.tbl_Products 
      where lm.TypeRef == pTypeId 
      select new; 

Sau đó, trong trình xử lý sự kiện, hãy áp dụng bất kỳ thứ gì bạn muốn trước khi gắn kết quả vào lưới.

var orderedData = from lm in data 
        order lm.Code ascending 
        select new; 

// TODO: Display orderedData in a grid. 

Truy vấn đầy đủ bạn liệt kê là truy vấn sẽ được đánh giá. Điều này có nghĩa là bạn có thể chạy truy vấn riêng cho từng mục trong trình đơn thả xuống của mình, được tạo từ truy vấn "cơ sở".

+0

vâng nhưng trong này, tôi phải viết nhiều câu lệnh if ?? Tôi có thể khai báo orderData ra khỏi nếu tuyên bố – Azhar

3
public static IEnumerable<T> OrderByIf<T,TKey>(this IEnumerable<T> source, bool condition, Func<T, TKey> keySelector) 
    { 
     return (condition) ? source.OrderBy(keySelector).AsEnumerable() : source; 
    } 

Cách sử dụng:

  var query = lDC.tbl_Products.Where(p => p.TypeRef == pTypeId) 
            .OrderByIf(sortColumn == "Price", p => p.Price) 
            .OrderByIf(sortColumn == "Code", p => p.Code);