将返回值组合为单个类型

时间:2014-08-04 21:23:01

标签: c# neo4j cypher neo4jclient

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

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

Article标签应用于仅包含唯一标识符的节点,ArticleTranslation标签应用于包含以下内容的节点:

  • 标题
  • 语言代码

然后我有一个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 */ } }

但是,在我的应用程序中,使用&#34;文章&#34;更有用(也更直观)。和&#34;翻译&#34;作为单一实体,例如:

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实体的情况下,是否有更简洁的表达方式?

1 个答案:

答案 0 :(得分:0)

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

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

在此示例中,返回文字地图,然后由Neo4jClient映射到ArticleTranslation类型。