是否可以从Session.CreateCriteria()中选择我想要的列?
egz:
var x = session.CreateCriteria();
x.CreateAlias("EmployeePosition", "employeePosition");
x.Add(Restrictions.Eq("employeePosition.Name", "Developer"));
并且有一种方法可以添加“select LastName”之类的内容,以避免下载整行。
答案 0 :(得分:3)
创建一个只包含您需要的属性的类,通常这是一个类似{Id,Label}的摘要类,并且您可以在需要简单类型的任何位置重用它,例如在列表中。使用ProjectionList定义要返回的列。然后使用Transformers.AliasToBean将结果转换为简单类型。
ProjectionList projectionList = Projections.ProjectionList();
projectionList.Add(Projections.Property("EmployeeID"), "Id");
projectionList.Add(Projections.Property("EmployeePosition"), "Label");
var x = DetachedCriteria.For(Employee);
x.SetProjection(projectionList);
x.SetResultTransformer(Transformers.AliasToBean(SimpleType)));
return x.GetExecutableCriteria(UnitOfWork.CurrentSession).List<SimpleType>();
答案 1 :(得分:2)
您可以使用投影执行此操作:
IList<Object[]> list = session.CreateCriteria(typeof(Employee))
.SetProjection(Projections.ProjectionList()
.Add(Projections.Property("FirstName"))
.Add(Projections.Property("LastName"))
).List<Object[]>();
foreach( Object[] person in list )
{
String firstName = person[0];
String lastName = person[1];
}
查看其他Projections的NHibernate.Expressions命名空间。
答案 2 :(得分:1)
我建议尝试给Linq NHibernate。它会让你以非常自然的方式做你想要的事情。
答案 3 :(得分:0)
要添加到dana's答案,如果您有想要阅读的实际课程,您还可以将Transformers.AliasToBean与投影一起使用。然后,NHibernate将尝试使用匹配字段名称的值填充对象的属性。