2014-06-10 28 views
6

Tôi có một webapi trả về một đối tượng chứa một số bộ sưu tập các đối tượng cũng chứa một bộ sưu tập các đối tượng. Mỗi đối tượng này có một bool đại diện cho nếu đối tượng được 'xuất bản' Xem các lớp dưới đây cho ý tưởng chung.Giới hạn các đối tượng trong một tập hợp được sắp xếp theo thứ tự dựa trên User

public class A { 
    public int ID { get; set; } 
    public List<B> b { get; set;} 
} 

public class B { 
    public List<C> c { get; set; } 
    public List<D> d { get; set; } 
    public bool published { get; set; } 
} 

public class C { 
    public string Title { get; set; } 
    public bool published { get; set; } 
} 

public class D { 
    public string Title { get; set; } 
    public bool published { get; set; } 
} 

cách tốt nhất là gì để làm cho nó như vậy khi tôi serialize bất kỳ của các đối tượng mà một chưa được công bố đối tượng trẻ em được không bao gồm nếu người dùng không đáp ứng được yêu cầu này, IE không ở trong một vai trò cụ thể. Tôi có thể thêm các thuộc tính dữ liệu vào mô hình của mình theo một cách nào đó không? Tôi đã có một cái nhìn vào sử dụng một tùy chỉnh IContractResolver nhưng tôi không chắc chắn nó là cách tốt nhất để xử lý các đối tượng lồng nhau. Tôi có nên xử lý điều này trong giai đoạn serializing hay tôi nên loại bỏ các đối tượng chưa được xuất bản từ các trẻ em sau khi tôi nhận được đối tượng từ cơ sở dữ liệu.

+1

Tôi tự hỏi liệu có cách nào chỉ tải dữ liệu có liên quan đến vai trò của người dùng đó hay không, theo cách đó bạn không phải lo lắng về việc phân tích cú pháp nó vào thời gian tuần tự hóa. – Prescott

+0

Tôi đã không đọc toàn bộ văn bản của bạn- Bạn có lý do để đưa tất cả dữ liệu xuống dưới dạng cơ sở dữ liệu không? Giả sử dữ liệu duy nhất được yêu cầu là dữ liệu cho vai trò của chúng - trừ khi bạn có một số lý do khác để đưa dữ liệu xuống từ db, tôi sẽ làm việc trên một giải pháp chỉ truy vấn dữ liệu cần thiết. – Prescott

+0

Bạn có cần bất kỳ đối tượng 'chưa được xuất bản' nào ở bất kỳ nơi nào trong mã của bạn ngoài các giai đoạn tuần tự hóa không? –

Trả lời

1

Khi nhận xét (đúng) chỉ ra tôi đã thực hiện điều này theo cách hơi sai.

Tôi đã giải quyết được sự cố của mình bằng cách yêu cầu hai cơ sở dữ liệu cơ bản trông giống như thế này.

A a = null; 

if(User.IsInRole("Role")){ 
    a = db.A.Find(Id); 
} else { 
    a = (from a in db.A 
     join b in db.B on a.ID equals b.ID 
     join c in db.C on b.ID equals c.ID 
     join d in db.D on b.ID equals d.ID 
     where a.ID == id && b.Published && c.Published && d.Published 
     select a); 
} 

if(a == null) 
    return NotFound(); 

return Ok(a); 

Tôi đã cố gắng tránh mã như thế này nhưng tôi không chắc có cách nào tốt hơn để làm điều đó.

1

Thực ra tôi sẽ đề xuất cho một số người dùng nhất định chỉ tải dữ liệu cần thiết vì điều này sẽ tăng hiệu suất. Trường hợp nếu bạn muốn tải tất cả dữ liệu (cả được xuất bản và chưa được xuất bản) là tầm thường. Đối với người dùng chỉ có thể xem các mục đã xuất bản, tôi sẽ thực hiện truy vấn đó:

A model = context.ACollection.Where(a => a.ID == id).Select(a => 
    new A { 
     ID = a.ID, 
     b = a.b.Where(i => i.published == true).Select(i => 
      new B{ 
       published = true, 
       c = i.c.Where(c_item => c_item.published == true), 
       d = i.d.Where(d_item => d_item.published == true) 
      }) 
    }).Single(); 

Truy vấn này sẽ mang lại hiệu suất tốt cho bạn.

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