2010-07-08 36 views

Trả lời

11

DataContext dành riêng cho LINQ to SQL, vì vậy có lẽ bạn đang nói về các truy vấn LINQ to SQL? Nếu vậy, không có cách nào an toàn để thực hiện việc này - bạn phải sử dụng tính năng hack như sử dụng phản chiếu để truy xuất trường "ngữ cảnh" riêng của đối tượng DataQuery cơ bản:

static DataContext GetContext (IQueryable q) 
{ 
    if (!q.GetType().FullName.StartsWith ("System.Data.Linq.DataQuery`1")) return null; 
    var field = q.GetType().GetField ("context", BindingFlags.NonPublic | BindingFlags.Instance); 
    if (field == null) return null; 
    return field.GetValue (q) as DataContext; 
} 
+1

Bạn đã đề cập đến đây là một hack, nhưng nó không nên được khuyến khích ngay cả như vậy. Việc truy cập các thành viên riêng thông qua sự phản chiếu không phải là một thực hành tốt, và nó sẽ tạo ra mã giòn. Làm như vậy cũng ẩn phụ thuộc giữa mã gọi và lớp DataContext. –

+0

+1 vì điều này thực sự có thể được sử dụng 'làm hack' để truy cập ngữ cảnh khi ai đó trả về IQueryable và sau đó có quyền truy cập đầy đủ để truy vấn:) –

+0

Một bổ sung nhỏ. System.Data.Linq.Table <> cũng có thể behing giao diện IQueryable. Mã: string typeName = q.GetType(). FullName; nếu (! TypeName.StartsWith ("System.Data.Linq.DataQuery'1", StringComparison.Ordinal) &&! TypeName.StartsWith ("System.Data.Linq.Table'1", StringComparison.Ordinal)) { trả về null; } –

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