gpt4 book ai didi

c# - 如何在 NHibernate QueryOver 查询中选择和使用值对象的集合

转载 作者:太空狗 更新时间:2023-10-29 23:47:58 27 4
gpt4 key购买 nike

我有一个简单的模型,由一个使用引用对象引用一篇或多篇文章的文档组成(这是因为在域中,我们不拥有这些文章,所以我们只能引用它们)。

我正在尝试编写一个列出文档的查询,打印 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。

这是表示结果列表中项目的 View 模型:

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 语句中使用它来制作逗号分隔字符串?

最佳答案

我认为您过于字面地理解了值对象的定义。为值对象分配代理标识符(标识列、Guid 等)并不会使其成为值对象。这是一个value object因为它的平等是基于它的值(value)观,而不是它的身份。这并不要求值对象不能有身份,实际上它几乎总是必须有。

您的应用程序显然必须能够将文档链接到一组 ArticleReferences,而实现此目的的最佳方法是向 ArticleReference 添加 ID。

关于c# - 如何在 NHibernate QueryOver 查询中选择和使用值对象的集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7059741/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com