我正在使用Azure并且发现性能很慢。为了减少往返时间,我将以下查询添加到一个查询中。
var queryItem = _graphClient
.Cypher
.Start(new
{
n = Node.ByIndexLookup("item_idx", "SKU", sSKU1),
})
.Return<Node<Item>>("n");
代码中的其他地方我有以下语句
var queryItem = _graphClient
.Cypher
.Start(new
{
m = Node.ByIndexLookup("item_idx", "SKU", sSKU2),
})
.Return<Node<Item>>("m");
我尝试将上述两个查询合并到一个像这样的
的查询中var queryItem = _graphClient
.Cypher
.Start(new
{
n = Node.ByIndexLookup("item_idx", "SKU", sSKU1),
m = Node.ByIndexLookup("item_idx", "SKU", sSKU2),
})
.Return<Node<Item>>("n");
我知道上面仅针对单列,所以我尝试使用以下return语句
.Return((n, m) => new
{
N = n.CollectAs<Node<Item>>(),
M = m.CollectAs<Node<Item>>()
});
然后我遇到以下陈述的问题
Node<Item> item1 = itemQueryResult.First();
它表示错误无法将类型'AnonymousType#1'隐式转换为'Neo4jClient.Node。
您能否建议一个简单的语法或返回多列以及提取第一个节点的方法? TIA。
答案 0 :(得分:5)
我认为你在这里缺少的是Return
语句为每个Cypher行返回一个对象。
您的查询返回如下表格:
|-----------------|
| n | m |
|-----------------|
| Node | Node |
|------------------
这是一个表,有一行,有两列。
在此声明中,您将返回每个Cypher行的匿名类型 :
.Return((n, m) => new
{
N = n.CollectAs<Node<Item>>(),
M = m.CollectAs<Node<Item>>()
});
该方法的返回类型为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;
有意义吗?
PS:我希望你实际上并不是夜总会。小海豹不喜欢那样。您正在合并查询。