【发布时间】:2023-03-26 17:21:01
【问题描述】:
我有一个简单的模型,由一个使用引用对象引用一篇或多篇文章的文档组成(这是因为在域中,我们不拥有这些文章,所以我们只能引用它们)。
我正在尝试编写一个列出文档的查询,打印 ID 和一个由逗号分隔的文章编号列表组成的字符串。例如:
ID ARTICLES
------------------
1 ACC, PE2,
2 ER0, AQ3, FEE
3 PE2
我的问题是选择逗号分隔列表。
以下是域类:
// 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; }
}
文章引用是一个值对象,因此它没有自己的 ID。
这是代表结果列表中的项目的视图模型:
public class DocumentListItemModel
{
public int Id { get; set; }
public string ArticleNumbers { get; set; }
public string ReceiveDate { get; set; }
}
这是我到目前为止提出的查询类:
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; }
}
}
如您所见,我无法表达.Where 语句,因为从域的角度来看,无法匹配对文档的引用。引用是值对象,因此没有 ID。
问题是:如何修复查询以正确选择文章编号列表,以便在string.Join 语句中使用它来生成逗号分隔字符串?
【问题讨论】:
-
你试过添加 public int 吗? DocumentId {get;set;} 到 ArticleReference? ps 不是 nhibernate 中应该是虚拟的属性
-
你说得对,我更新了我的问题。我在编写概念代码时忘记了它们(实际代码由于其大小太分散注意力)。关于将 DocumentId 添加到 ArticleReference:这将违背价值对象的整个想法,有效地将其变成一个实体。
-
true - 但由于这些问题,我倾向于在我的应用程序模型中使用单独的域模型,因此我添加了一些有趣的东西,例如向子实体添加 parentid 属性。
-
@Shaun Wilde 属性只需要在延迟加载时是虚拟的。当然,大多数时候您会使用延迟加载,但它们在 NHibernate 中并不是必需的。
-
@Sandor:你为什么有这个 ArticleReference 类?我看不出这有什么意义。为什么不只是参考文章?它会让生活更轻松......
标签: c# .net nhibernate queryover