我如何在 Neo4jClient 中写这个
How do I write this in Neo4jClient
感谢 Dave Bennett,我有一个很棒的 Neo4j 查询可以提供我需要的结果。我需要让它在 Neo4JClient 中工作。这是我的工作 Neo4j 查询:
`// Composite Tile with related users
match (t:Tile{summary:"Test 1"})<-[:ASSIGNED_TO]-(u:User)
with {summary: t.summary,
id: t.id,
sprint_id: t.sprint_id,
size: t.size,
percent_done: t.percent_done,
color: t.color_id,
description: t.description,
queue_id: t.queue_id,
swimlane_id: t.swimlane_id,
icons: t.icons,
order: t.order,
assignees: collect(u)} as tile
RETURN collect(tile) as tiles`
Visual Studio and/or Neo4jClient 对我的尝试不是很满意:
var compositeTile = client.Cypher
.Match("(t:Tile)<-[:ASSIGNED_TO]-(u:User)")
.Where((Tile t)=> t.summary == tile.summary)
.With( {
summary: t.summary,
id: t.id,
sprint_id: t.sprint_id,
size: t.size,
percent_done: tile.percent_done,
color: t.color,
description: t.description,
queue_id: t.queue_id,
swimlane_id: t.swimlane_id,
icons: t.icons,
Order: t.order,
assignees: collect(u)
} as tile)
.return collect(tile) as tiles;
它只是抛出了很多红色波浪线,我怀疑是因为我没有正确格式化 .with 语句。我找不到例子,所以我在这里问。我如何在 Neo4jClient 中正确执行此操作?
因此,您的问题有两个答案 - 第一个是 .With
语句将字符串作为参数,因此您只需要用 "
(或 @"
如果你想保留格式)。不过,第二个答案对你来说更成问题:
不可能用 Neo4jClient
做你想做的事 - 目前它不允许你创建匿名类型。它无法反序列化内容。我认为这可能是一个快速修复,但它似乎会涉及更多。所以,我们在这里看到的是查询的变化。
我假设您有一个名为 Tile
的 class,其中包含您想要的属性。所以 I 会将查询更改为如下内容:
client.Cypher
.Match("(t:Tile)<-[:ASSIGNED_TO]-(u:User)")
.Where((Tile t) => t.summary == tile.summary)
.Return((t,u) => new {
Tile = t.As<Tile>(),
User = u.CollectAs<User>()
});
这将为您提供一个带有 Tile 和 IEnumerable<Node<User>>
元素的 C# 匿名类型,显然您想要 Tile
中的 Users
,因此您可以解析结果:
var tiles = new List<Tile>();
foreach (var result in results)
{
var tile = result.Tile;
foreach (var user in result.Users)
tile.users.Add(user.Data);
tiles.Add(tile);
}
您可能会发现,您需要初始化 Users
集合,因此要么将 Users = new List<User>()
添加到您的 Tile
构造函数中,要么就在解析数据之前。
感谢 Dave Bennett,我有一个很棒的 Neo4j 查询可以提供我需要的结果。我需要让它在 Neo4JClient 中工作。这是我的工作 Neo4j 查询:
`// Composite Tile with related users
match (t:Tile{summary:"Test 1"})<-[:ASSIGNED_TO]-(u:User)
with {summary: t.summary,
id: t.id,
sprint_id: t.sprint_id,
size: t.size,
percent_done: t.percent_done,
color: t.color_id,
description: t.description,
queue_id: t.queue_id,
swimlane_id: t.swimlane_id,
icons: t.icons,
order: t.order,
assignees: collect(u)} as tile
RETURN collect(tile) as tiles`
Visual Studio and/or Neo4jClient 对我的尝试不是很满意:
var compositeTile = client.Cypher
.Match("(t:Tile)<-[:ASSIGNED_TO]-(u:User)")
.Where((Tile t)=> t.summary == tile.summary)
.With( {
summary: t.summary,
id: t.id,
sprint_id: t.sprint_id,
size: t.size,
percent_done: tile.percent_done,
color: t.color,
description: t.description,
queue_id: t.queue_id,
swimlane_id: t.swimlane_id,
icons: t.icons,
Order: t.order,
assignees: collect(u)
} as tile)
.return collect(tile) as tiles;
它只是抛出了很多红色波浪线,我怀疑是因为我没有正确格式化 .with 语句。我找不到例子,所以我在这里问。我如何在 Neo4jClient 中正确执行此操作?
因此,您的问题有两个答案 - 第一个是 .With
语句将字符串作为参数,因此您只需要用 "
(或 @"
如果你想保留格式)。不过,第二个答案对你来说更成问题:
不可能用 Neo4jClient
做你想做的事 - 目前它不允许你创建匿名类型。它无法反序列化内容。我认为这可能是一个快速修复,但它似乎会涉及更多。所以,我们在这里看到的是查询的变化。
我假设您有一个名为 Tile
的 class,其中包含您想要的属性。所以 I 会将查询更改为如下内容:
client.Cypher
.Match("(t:Tile)<-[:ASSIGNED_TO]-(u:User)")
.Where((Tile t) => t.summary == tile.summary)
.Return((t,u) => new {
Tile = t.As<Tile>(),
User = u.CollectAs<User>()
});
这将为您提供一个带有 Tile 和 IEnumerable<Node<User>>
元素的 C# 匿名类型,显然您想要 Tile
中的 Users
,因此您可以解析结果:
var tiles = new List<Tile>();
foreach (var result in results)
{
var tile = result.Tile;
foreach (var user in result.Users)
tile.users.Add(user.Data);
tiles.Add(tile);
}
您可能会发现,您需要初始化 Users
集合,因此要么将 Users = new List<User>()
添加到您的 Tile
构造函数中,要么就在解析数据之前。