是否可以从 Session.CreateCriteria() 中选择我想要的列?
例如:
var x = session.CreateCriteria();
x.CreateAlias("EmployeePosition", "employeePosition");
x.Add(Restrictions.Eq("employeePosition.Name", "Developer"));
有没有办法添加“选择姓氏”之类的内容以避免下载整行。
是否可以从 Session.CreateCriteria() 中选择我想要的列?
例如:
var x = session.CreateCriteria();
x.CreateAlias("EmployeePosition", "employeePosition");
x.Add(Restrictions.Eq("employeePosition.Name", "Developer"));
有没有办法添加“选择姓氏”之类的内容以避免下载整行。
创建一个只包含您需要的属性的类,通常这是一个像 {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>();
您可以使用投影来做到这一点:
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 命名空间。
我建议尝试将 Linq 用于 NHibernate。它会让你以一种非常自然的方式做你所要求的。
要添加到dana 的答案,如果您有一个实际的类要读取它,您还可以将 Transformers.AliasToBean 与投影一起使用。然后 NHibernate 将尝试使用匹配字段名称的值填充对象的属性。