将返回值组合成单一类型

本文关键字:单一 类型 组合 返回值 | 更新日期: 2023-09-27 18:16:26

我有一个Neo4j关系,看起来像这样:

(a:Article)<-[:TRANSLATES]-(t:ArticleTranslation)

Article标签应用于仅持有唯一标识符的节点,ArticleTranslation标签应用于包含:

的节点
    标题
  • 身体
  • LanguageCode

然后我有一个ICypherFluentQuery,构造如下:

Match("(t:ArticleTranslation)-[:TRANSLATES]->(a:Article)")
    .Where("(a.Id = {id})")
    .AndWhere("(t.LanguageCode = {lang} OR (t.LanguageCode = 'en' and NOT a<--(:ArticleTranslation { LanguageCode: {lang} })))")
    .WithParams(new { id, lang })
从这里,我理解我可以很容易地将(a, t)映射到包含两个对象实例的匿名对象,例如:
new { Article = new Article { /* Article Properties */ },
    Translation = new ArticleTranslation { /* Translation Properties */ } }
然而,在我的应用程序中,将 "article"answers"translation"作为一个单独的实体使用更有用(也更直观),例如:
public class Article
{
    public string Id { get; set; }
    public string Title { get; set; }
    public string Body { get; set; }
    public string LanguageCode { get; set; }
}

我已经设法通过添加以下内容来做到这一点:

.Return((a, t) => new Article
    {
        Id = a.As<Article>().Id,
        Title = t.As<Article>().Title,
        Body = t.As<Article>().Body,
        LanguageCode = t.As<Article>().LanguageCode
    });

然而,这是笨拙的(特别是当增加属性的数量时),并且看起来可能会调用重复的映射。

在不引入独立的ArticleTranslation实体的情况下,是否有更简洁的表达方式?

将返回值组合成单一类型

您可以告诉Neo4jClient生成任意Cypher RETURN语句-并将其映射到所需的类型-通过传递一个无参数委托:

.Return(() => Return.As<ArticleTranslation>(
    "{ArticleId:a.Id, Title:t.Title, Body:t.Body, LanguageCode:t.LanguageCode}"))

在本例中,Neo4jClient返回文字映射,然后将其映射到ArticleTranslation类型。