2011-06-23 48 views
8

Truy vấn LINQ "order by" không hoạt động và tôi đã theo dõi tất cả các đề xuất được tìm thấy trên trang web của bạn và các trang web khác. Bất kỳ trợ giúp sẽ được đánh giá cao.Đặt hàng LINQ Bằng cách không hoạt động

[WebGet] 
    public IQueryable<vw_providercharge_providers> GetChargeProviders(int submitted) 
    { 
     var results = (from p in this.CurrentDataSource.vw_providercharge_providers 
         where p.submitted == submitted 
         orderby p.fullname 
         select p); 
     return results; 
    } 

Cảm ơn thông tin của bạn!

Có, đây là phương pháp WebGet cho dịch vụ dữ liệu WCF. Tôi nhận được lỗi 400 nếu tôi không trả lại loại IQueryable, vì vậy tôi đã sửa đổi đề xuất của bạn một chút. Thật không may, nó vẫn có vẻ bỏ qua bất kỳ thứ tự theo.

[WebGet] 
public IQueryable<vw_providercharge_providers> GetChargeProviders(int submitted) 
{ 
    var results = (from p in this.CurrentDataSource.vw_providercharge_providers 
        where p.submitted == submitted 
        orderby p.fullname 
        select p).ToArray(); 
    results.OrderBy(p => p.patientname); 
    return results; 
} 
+3

Ý của bạn là "không hoạt động?" Bạn mong đợi điều gì, và nó đang làm gì? – jason

+0

Vui lòng giải thích ý bạn là "không hoạt động". – devuxer

+0

Điều gì bất ngờ về kết quả bạn đang nhận được? Hãy thử .OrderBy (p => p.fullname); – esastincy

Trả lời

19

Tôi thông báo bạn trả về IQueryable<T> - bạn có gọi bất kỳ phương thức LINQ nào trước khi bạn liệt kê phương pháp này không?

Not all LINQ methods preserve order. Thông thường, gọi Distinct()sau bạn thực hiện việc đặt hàng sẽ hủy đơn hàng.

+2

Cảm ơn bạn đã nhận xét về Distinct() gây ra sự cố cho tôi. Giải pháp được tìm thấy ở đây [link] (http://stackoverflow.com/questions/12428985/distinct-and-orderby-issue) – mack

1

Vì phương pháp của bạn được đánh dấu bằng thuộc tính WebGet, tôi giả định rằng bạn đang gọi phương thức này từ điểm cuối Web, do đó bạn có thể cần thu gọn bộ sưu tập trước khi gửi qua internet.

Hãy thử:

[WebGet] 
public vw_providercharge_providers[] GetChargeProviders(int submitted) 
{ 
    var results = (from p in this.CurrentDataSource.vw_providercharge_providers 
        where p.submitted == submitted 
        orderby p.fullname 
        select p).ToArray(); 
    return results; 
} 

Bằng cách này bạn có đảm bảo rằng sự trở về phương pháp GetChargeProviders và mảng thay vì một biểu thức LINQ.

Kính trọng,

1

Tôi đã tìm ra nguyên nhân của vấn đề.

Tôi chưa đặt cột "tên đầy đủ" làm Khóa thực thể cho thực thể mô hình dữ liệu "vw_providercharge_providers". Chỉ có cột nhận dạng được đặt làm Khóa thực thể. Tôi đã không nhận ra rằng đó là một yêu cầu để sử dụng nó theo thứ tự theo mệnh đề.

Cảm ơn bạn lần nữa vì đã nhập.

+3

Điều này không chính xác. Một cột không phải được định nghĩa là một khóa thực thể trong mô hình dữ liệu cho phương thức OrderBy. Tôi nghi ngờ rằng bạn đang chạy vào một số hành vi kỳ lạ do cách thức mà quan điểm của bạn được thiết lập trong mô hình dữ liệu của bạn (hoặc đúng hơn là cách thức không chính xác). Tôi nghi ngờ rằng đã thêm cột "tên đầy đủ" là Khóa thực thể hiện đang buộc kết quả của bạn theo thứ tự theo cột này bất kể bạn có sử dụng cụ thể orderby trong truy vấn LINQ của bạn hay không. Tôi sắp xếp theo các cột khác nhau không phải là các khóa trong các khung nhìn trong ngữ cảnh dữ liệu của tôi (Entity Framework) và nó ra lệnh cho chúng tốt. – Jagd

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