2011-03-22 93 views
3

正如问题所述,我知道使用NHinbernate我可以告诉一个具体的查询Fetch(Func<T,bool>),甚至FetchMany()。但是如果我想以相反的方式做呢?nHibernate,我可以告诉它去取<T>,但我可以告诉它保持<T>?

例如,让我们说,我们有一个类..

class Employee { 
    public virtual string Name { get; set; } 
    public virtual Address Address { get; set; } 
    public virtual double Salary { get; set; } 
} 

如果Employee正在寻找自己的个人资料,我希望AddressSalary被渲染。但是如果一个不同的员工在看什么呢?构建一个ASP.NET MVC视图似乎更为方便,但特别是不返回需要隐藏的数据。因此,像..

if(// myself //) { 
    return employee = session.Query<Employee>() 
     .Fetch(context => context.Address) 
     .Take(1) 
     .SingleOrDefault(); 
} 
else 
    return employee = session.Query<Employee>() 
     .Deny(context => context.Address) 
     .Deny(context => context.Salary) 
     .Take(1) 
     .SingleOrDefault(); 

然后我的观点可能的样子..

@model Employee 

<h2>@Model.Name</h2> 
<h4>@Html.DisplayFor(model => model.Address)</h4> 
<h4>@Model.Salary</h4> 

我知道这是不是在宇宙中最好的例子,但这样的事情可能吗?到目前为止,我还没有找到任何明确告诉对象不返回的方法。

+0

+1狗笑话 – Martin 2011-03-22 18:31:32

回答

3

一如既往,ASP.NET MVC中所有内容的答案是:查看模型。因此,您可以获取存储库中的所有内容,并返回包含所有属性的域Employee模型,然后将此Employee模型映射到EmployeeViewModel。那么这个视图模型将被传递给视图。当控制器根据用户在模型和视图模型之间进行映射时,它可能包含或不包含某些属性。

+0

是的,我可以将它抽象成视图模型,我想如果我可以在数据端完全停止额外的查询,它会更有效率。这就好像在说:“好吧,从这所房子里拿出所有东西,但是当你回来时,我只需要一件东西。” – Ciel 2011-03-22 18:50:41

相关问题