12

Tôi đang sử dụng cách tiếp cận CodeFirst và xảy ra với một vấn đề mà tôi cần phải chuyển đổi DbSet để ObjectQuery. Đây là những gì tôi đã làm để chuyển đổi.Làm thế nào để chuyển đổi DbSet trong khuôn khổ thực thể để ObjectQuery

ObjectContext objectContext = ((IObjectContextAdapter)db).ObjectContext; 
ObjectSet<Request> objectSet = objectContext.CreateObjectSet<Request>(); 

trong đó db là ngữ cảnh kế thừa từ DbContext và Yêu cầu là lớp.

Vì vậy, khi tôi cố gắng gọi phương thức dự kiến ​​ObjectQuery là ObjectQueryMethod (objectSet), nó sẽ ném lỗi sau đây.

"Loại biểu thức điều kiện không xác định được vì không có chuyển đổi ngầm giữa 'System.Data.Entity.DbSet <>' và 'System.Data.Objects.ObjectQuery <>'"

Bất kỳ sự giúp đỡ là đánh giá cao!

+0

Tại sao bạn cần phải chuyển đổi một DbSet thành một ObjectQuery? – Kittoes0124

+0

Cung cấp thêm chi tiết - 'ObjectQueryMethod' là gì? Cách tiếp cận hiện tại của bạn là chính xác. Bạn không thể chuyển đổi 'DbSet' thành' ObjectQuery'. Bạn phải tạo 'ObjectSet' và sử dụng nó thay vì' DbSet'. –

+0

@Kittoes: Tôi đang cố gắng triển khai Tìm kiếm nâng cao trong JQGrid và ObjectQuery có vẻ là một trong những quyền phân tích các thông số (bộ lọc) được gửi lại cho máy chủ. – inspiringmyself

Trả lời

23

Tôi đã tìm thấy câu trả lời. Tất nhiên, có thể chuyển đổi DbSet trong khung Entity thành ObjectQuery bằng cách sử dụng các dòng mã dưới đây.

ObjectContext objectContext = ((IObjectContextAdapter)db).ObjectContext; 
ObjectSet<Request> objectSet = objectContext.CreateObjectSet<Request>("Requests"); 

nơi,

  • db - Bối cảnh lớp inherting từ DbContext.
  • Requests - DbSet<Request> được định nghĩa trong lớp Ngữ cảnh.
  • objectSet - Hiện có thể được chuyển thành ObjectQuery.
+5

AFAIK bạn có thể để nguyên chuỗi đó làm tham số, làm cho nó ít bị lỗi hơn: 'objectContext.CreateObjectSet ();' –

2

Cảm ơn câu trả lời đúng 'truyền cảm hứng'; đây chỉ là để xây dựng trên câu trả lời của bạn. Tôi cố gắng làm điều này với một loại chung chung, vì vậy chỉ cần chia sẻ nó:

private List<T> GetByCustomCriteria<T>(string criteria) where T: class 
{ 
    var objectContext = ((IObjectContextAdapter)_myModelEntities).ObjectContext; 
    //note: _myModelEntities is a DbContext in EF6. 
    var objectSet = objectContext.CreateObjectSet<T>(); 
    return new List<T>(objectSet.Where(criteria)); 
} 

Và tôi nghĩ bài viết ở trên có thể làm với một ví dụ về những gì tiêu chí để gửi vì vậy đây là một ví dụ là:

//sample criteria for int field: 
var myClientById = GetByCustomCriteria<Client>("it.Id == 1");` 

//sample criteria for string field, note the single quotes 
var myClientByName = GetByCustomCriteria<Client>("it.Surname == 'Simpson'");