我使用Azure并发现性能很慢.为了减少往返时间,我将以下查询分成一个查询.
var queryItem = _graphClient
.Cypher
.Start(new
{
n = Node.ByIndexLookup("item_idx", "SKU", sSKU1),
})
.Return<Node<Item>>("n");
Run Code Online (Sandbox Code Playgroud)
代码中的其他地方我有以下语句
var queryItem = _graphClient
.Cypher
.Start(new
{
m = Node.ByIndexLookup("item_idx", "SKU", sSKU2),
})
.Return<Node<Item>>("m");
Run Code Online (Sandbox Code Playgroud)
我试图将上面两个查询组合成一个像这样的查询
var queryItem = _graphClient
.Cypher
.Start(new
{
n = Node.ByIndexLookup("item_idx", "SKU", sSKU1),
m = Node.ByIndexLookup("item_idx", "SKU", sSKU2),
})
.Return<Node<Item>>("n");
Run Code Online (Sandbox Code Playgroud)
我知道上面仅针对单列,所以我尝试使用以下return语句
.Return((n, m) => new
{
N = n.CollectAs<Node<Item>>(),
M = m.CollectAs<Node<Item>>()
});
Run Code Online (Sandbox Code Playgroud)
但是我对以下声明有疑问
Node<Item> item1 = itemQueryResult.First();
Run Code Online (Sandbox Code Playgroud)
它说错误不能隐式地将类型'AnonymousType#1'转换为'Neo4jClient.Node.
你能建议一个简单的语法或返回多列以及提取第一个节点的方法吗?TIA.
我认为你在这里缺少的是该Return语句每个Cypher行返回一个对象.
您的查询返回如下表:
|-----------------|
| n | m |
|-----------------|
| Node | Node |
|------------------
Run Code Online (Sandbox Code Playgroud)
这是一个表,有一行,有两列.
在此语句中,每个Cypher行返回一个匿名类型:
.Return((n, m) => new
{
N = n.CollectAs<Node<Item>>(),
M = m.CollectAs<Node<Item>>()
});
Run Code Online (Sandbox Code Playgroud)
该方法的返回类型是IEnumerable<AnonymousType>.
然后,您尝试获取第一行(匿名类型)并隐式地将其转换Node<Item>为无效.
您应该获取该行,然后获取其中的属性.
其他一些注意事项:
CollectAs在这种情况下使用:这会将表的每个单元格转换为具有单个值的数组,这只会增加更多间接..As<Node<T>>() 可写成 .Node<T>()考虑到这一点,这是您想要的查询:
var result = _graphClient
.Cypher
.Start(new
{
n = Node.ByIndexLookup("item_idx", "SKU", sSKU1),
m = Node.ByIndexLookup("item_idx", "SKU", sSKU2),
})
.Return((n, m) => new
{
N = n.Node<Item>(),
M = m.Node<Item>()
})
.Results
.Single();
var n = result.N;
var m = result.M;
Run Code Online (Sandbox Code Playgroud)
合理?
PS:我希望你是不是真正泡吧什么.小海豹不喜欢那样.您正在组合查询.