将返回值组合成单一类型
本文关键字:单一 类型 组合 返回值 | 更新日期: 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
类型。