限制集合中的对象基于用户进行序列化

时间:2014-06-10 17:53:32

标签: c# entity-framework json.net asp.net-web-api2

我有一个webapi,它返回一个包含一些对象集合的对象,这些对象也包含一组对象。这些对象中的每一个都有一个bool,表示对象是否已发布'请参阅以下课程,了解一般概念。

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; }
}

当我序列化任何这些对象时,如果用户不满足要求,IE不在特定角色,则不包括未发布的子对象,最好的方法是什么。我可以以某种方式向我的模型添加数据属性吗?我已经看过使用自定义IContractResolver,但我不确定它是处理嵌套对象的最佳方法。我应该在序列化阶段处理这个问题,还是应该在从数据库中获取对象后从子代中删除未发布的对象。

2 个答案:

答案 0 :(得分:1)

正如评论(正确地)指出的那样,我的方式略有不同。

我通过让两个数据库请求看起来像这样来解决我的问题。

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);

我试图避免这样的代码,但我不确定有更好的方法来做到这一点。

答案 1 :(得分:1)

实际上我建议某些用户只加载所需的数据,因为这会提高性能。如果要加载所有数据(已发布和未发布)的情况很简单。对于只能查看已发布项目的用户,我会进行此类查询:

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();

此查询应该会为您提供良好的效果。