我正在尝试制作一个可以过滤连接到用户的对象的通用代码。这些对象可以是不同类型,具有不同的属性等。
基本上我想实现这个方法:
public string GetRelatedObjects(string sourceObject, string userId){
var resQuery = GraphDB.Cypher
.Match("(src:" + sourceObject + ")--(usr:User { Id:{userId} })")
.WithParam("userId", userId)
.Return(src => src.As<object>());
var result = await resQuery.ResultsAsync;
return JsonConvert.SerializeObject(result);
}
问题是当我使用.As<object>()
时,我会找回一个空项目。
当我提出具体类型时,例如.As<User>()
我会得到我期望的结果。有没有办法得到我想用Neo4JClient获得的东西,还是我必须以某种方式降低水平?
答案 0 :(得分:2)
因此,在引擎盖下,Neo4jClient使用Json.NET将Neo4j的输出反序列化为您指定的类。当您指定没有属性的object
时,您将无法获得任何属性。 Neo4jClient和Json.NET都不知道你实际上在追求什么,所以你只能得到object
。现在,解决方案时间 - 您可以改为使用dynamic
。
public async Task<string> GetRelatedObjectsAsJson(string sourceObject, string userId)
{
var resQuery = GraphDB.Cypher
.Match(string.Format("(src:{0})--(usr:User {{ Id:{{userId}} }})", sourceObject))
.WithParam("userId", userId)
.Return(src => src.As<Node<string>>());
var result = await resQuery.ResultsAsync;
var output = result.Select(node => JsonConvert.DeserializeObject<dynamic>(node.Data)).ToList();
return JsonConvert.SerializeObject(output);
}
我认为这会得到你想要的,如果我是你,我可能会返回Task<IEnumerable<dynamic>>
而不是重新序列化为string
,但我不会&#39 ; t知道你想用什么结果,所以可能不合适。
有关详细信息,请参阅Casting nodes of an unknown type。
答案 1 :(得分:0)
您可以通过创建通用节点类来返回具有其所有属性的节点。
准确地说,可以通过
来完成C#Class:
public class GenNode
{
public long Id { get; set; }
public IEnumerable<String> Labels { get; set; }
public Dictionary<String, String> Properties { get; set; }
}
重写方法:
public IEnumerable<GenNode> GetRelatedObjects(string sourceObject, string userId){
var resQuery = GraphDB.Cypher
.Match("(src:" + sourceObject + ")--(usr:User { Id:{userId} })")
.WithParam("userId", userId)
.With("src, properties(src) as prop")
.Return((src,prop) => new GenNode
{
Id = src.Id(),
Labels = src.Labels(),
Properties = prop.As<Dictionary<Object,Object>>()
});
var result = await resQuery.ResultsAsync;
return result;
}
注意返回类型。