2012-01-25 24 views
10

Tôi đang cố gắng sử dụng LINQ trên kết quả tôi nhận được từ Mô hình đối tượng khách hàng.Sử dụng LINQ trên kết quả mô hình Đối tượng khách hàng từ sharepoint

var rolesAssignments = context.Web.RoleAssignments; 
context.Load(rolesAssignments, 
    roles => roles.IncludeWithDefaultProperties(role => role.Member, 
    role => role.RoleDefinitionBindings)); 
context.ExecuteQuery(); 
var hasAdmin = rolesAssignments.Select(x => x.RoleDefinitionBindings.Cast<RoleDefinition>().Select(y => y.RoleTypeKind == RoleType.Administrator)).Any(); 

tôi nhận được:

{System.NotSupportedException: việc sử dụng không hợp lệ thực hiện truy vấn. Truy vấn phải được thực hiện bằng cách sử dụng phương thức ExecuteQuery trên đối tượng ngữ cảnh của máy khách.

Tuy nhiên, khi tôi viết lại điều này để sử dụng vòng lặp forested lồng nhau, nó hoạt động tốt.

Từ những gì tôi có thể thấy từ truy vấn LINQ của mình, tôi không sử dụng bất kỳ thuộc tính nào không được tải.

Trả lời

3

Đây là phần đầu của tôi nhưng nó sẽ cho bạn ý tưởng. Bạn có thể nhận được khiếu nại về việc sử dụng Bất kỳ trong truy vấn. Nếu như vậy loại bỏ nó và sau đó kiểm tra hasAdmin.Any() sau khi ExecuteQuery hoàn tất.

var query = rolesAssignments.Select(x => x.RoleDefinitionBindings.Cast<RoleDefinition>().Select(y => y.RoleTypeKind == RoleType.Administrator)).Any(); 
var hasAdmin = context.LoadQuery(query); 
context.ExecuteQuery(); 
+0

Tôi cũng đã nhận lỗi khi tôi cố gắng này. var query = folders.Select (f => f.Name == folder). Đầu tiên() Tôi nên thử như thế nào? Tôi không hiểu câu trả lời của bạn. – kevin

15

Xin lỗi vì đã necroposting, nhưng tôi chỉ gặp phải vấn đề này và không thể tìm thấy câu trả lời ở đây. Lý do tại sao truy vấn LINQ của bạn không thành công là bộ sưu tập mô hình ứng dụng đã triển khai nhiều trình lặp. Và khi bạn cố gắng liệt kê các vai trò của mìnhCác yêu cầu bạn gọi IQueryable<T> các phương pháp mở rộng. Phương pháp này (tôi giả định) được thiết kế để lấy dữ liệu từ máy chủ thông qua một số cuộc gọi xà phòng bị đóng gói và không nên được sử dụng trên máy khách. Istead bạn nên sử dụng một cách rõ ràng phương pháp mở rộng của IEnumerable<T>. Vì vậy, điều này sẽ không làm việc:

var hasAdmin = rolesAssignments.Select(predicate); 

Và điều này sẽ làm việc:

var hasAdmin = ((IEnumerable<RoleAssignment>)rolesAssignments).Select(predicate); 
+0

Tôi đã rời khỏi dự án này trong một thời gian dài, vì vậy tôi không có cơ hội để xác minh. Trung thực không thể nhớ những gì tôi đã làm. Cảm ơn bạn đã thêm thông tin. – ruffen

+2

đẹp. cảm ơn nhiều! hoàn toàn đáng necroposting! – Nacht

+1

Đã khắc phục sự cố của chúng tôi. Cảm ơn! –

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