Nibernate Consulta CreateCriteria
-
27-09-2019 - |
Pergunta
É possível escolher quais colunas eu quero em troca da sessão.createcriteria ()?
Egz.:
var x = session.CreateCriteria();
x.CreateAlias("EmployeePosition", "employeePosition");
x.Add(Restrictions.Eq("employeePosition.Name", "Developer"));
E existe uma maneira de adicionar algo como "Select LastName" para evitar baixar a linha inteira.
Solução
Faça uma classe que tenha apenas as propriedades necessárias, geralmente é uma classe de resumo como {id, etiqueta} e você a reutiliza em qualquer lugar que precisar de um tipo simples, em uma listagem, por exemplo. Use o projectionList para definir quais colunas retornar. Em seguida, use Transformers.aliastobean para transformar o resultado em seu tipo simples.
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>();
Outras dicas
Você pode fazer isso usando projeções:
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];
}
Confira o espaço para nome do Nibernate.Expressões para outras projeções.
Eu sugeriria dar uma tentativa do LINQ para Nibernatar. Isso permitirá que você faça o que está perguntando de uma maneira muito natural.
Para adicionar Dana's Responda, se você tiver uma classe real em que deseja lê -la, também pode usar Transformers.aliasTobean com a projeção. O Nibernate tentará preencher as propriedades do objeto com valores de nomes de campos correspondentes.