Tengo un modelo simple, que consiste en un documento que hace referencia a uno o más artículo utilizando un objeto de referencia (esto es debido a que en el dominio, que no poseen los artículos así que solo podemos hacer referencia a ellos).Cómo seleccionar y consumir una colección de objetos de valor en una consulta NHibernate QueryOver
estoy tratando de escribir una consulta que lista los documentos, imprimir la ID y una cadena que consiste en una lista separada por comas de los números de artículo separado. Por ejemplo:
ID ARTICLES
------------------
1 ACC, PE2,
2 ER0, AQ3, FEE
3 PE2
Mi problema es con la selección de la lista separada por comas.
Estas son las clases de dominio:
// The Entity class has an Id property.
public class Document : Entity
{
public virtual IEnumerable<ArticleReference> ArticleReferences { get; set; }
public virtual DateTime ReceiveDate { get; set; }
}
// The ValueObject does not have an Id property ofcourse.
public class ArticleReference : ValueObject
{
public virtual string ArticleNumber { get; set; }
public virtual string ArticleName { get; set; }
}
La referencia del artículo es un objeto de valor por lo que no tiene una identificación propia.
Este es el modelo de vista que representa un elemento de la lista de resultados:
public class DocumentListItemModel
{
public int Id { get; set; }
public string ArticleNumbers { get; set; }
public string ReceiveDate { get; set; }
}
y aquí está la clase de consulta que he encontrado hasta el momento:
public class DocumentQuery
{
public IList<DocumentListItemModel> ExecuteQuery()
{
IntermediateModel model = null;
ArticleReference articleReferenceAlias = null;
return Session
.QueryOver<Document>()
.JoinAlias(n => n.ArticleReferences,() => articleReferenceAlias);
.SelectSubQuery(
QueryOver.Of<ArticleReference>(() => articleReferenceAlias)
// There is no way of matching references to documents from a domain
// point of view since the references are value objects and
// therefore don't have an ID.
.Where(n => ...)
.Select(q => articleReferenceAlias.Number))
.WithAlias(() => model.ArticleNumbers)
.TransformUsing(Transformers.AliasToBean<IntermediateModel>());
.Future<IntermediateModel>()
.ToList()
.Select(n =>
new DocumentListItemModel()
{
Id = n.Id,
ArticleNumbers = string.Join(", ", n.ArticleNumbers.OrderBy(p => p)),
ReceiveDate = n.ReceiveDate.ToString("d", CultureInfo.CurrentCulture)
})
.ToList();
}
private class IntermediateModel
{
public int Id { get; set; }
public IEnumerable<string> ArticleNumbers { get; set; }
public DateTime ReceiveDate { get; set; }
}
}
Como se puede ver, No puedo expresar la declaración .Where
porque no hay forma de hacer coincidir las referencias a los documentos desde el punto de vista de un dominio. Las referencias son objetos de valor y, por lo tanto, no tienen una ID.
La pregunta es: ¿Cómo puedo solucionar la consulta para seleccionar correctamente la lista de números de artículo para que pueda usarlo en mi declaración string.Join
para hacer la cadena separada por comas?
has necesitado añadir public int? DocumentId {get; set;} a ArticleReference? ps no son las propiedades que se supone que son virtuales en nhibernate –
Tienes razón sobre los virtuales, actualicé mi pregunta. Me había olvidado de ellos al escribir el código conceptual (el código real es demasiado molesto debido a su tamaño). En cuanto a agregar DocumentId a ArticleReference: eso desafiaría toda la idea de objetos de valor, convirtiéndolo efectivamente en una entidad. –
true - pero debido a problemas como estos, suelo tener un modelo de dominio separado para mi modelo de aplicación, así que agrego funnies como agregar una propiedad parentid a una entidad secundaria. –