2014-01-13 2 views
1

Я знаю, как динамически создавать свои статьи MATCH и WHERE, и в моей ситуации это, к сожалению, что-то мне нужно сделать ... ТАК, у меня есть что-то вроде (и это надуманный пример):Dynamically return from Neo4jclient

var query = client 
    .Cypher 
    .Match("(u1:User)-[:LINKED]->(w:Web)","(u2:User)-[:LINKED]->(w:Web)","(u3:User)-[:LINKED]->(w:Web)") 
    .Where("u1.User.Id = {u1Param}").WithParam("u1Param", 1) 
    .AndWhere("u2.User.Id = {u2Param}").WithParam("u2Param", 2) 
    .AndWhere("u3.User.Id = {u3Param}").WithParam("u3Param", 3); 

Match и Where генерируются динамически на основе пользовательского ввода, и это создает правильную Сайферу.

MATCH 
    (u1:User)-[:LINKED]->(w:Web), (u2:User)-[:LINKED]->(w:Web), (u3:User)-[:LINKED]->(w:Web) 
WHERE 
    u1.User.Id = 1 
    AND u2.User.Id = 2 
    AND u3.User.Id = 3 

На сервере (в Cypher), я могу сделать что-то вроде:

RETURN u1, u2, u3 

и я получу 3 узлов я ищу. Моя проблема заключается в общем способе Returning данных через neo4jclient осуществляется через слова, так, чтобы повторить я хотел бы сделать:

query.Return(
    (u1, u2, u3) => 
    { 
     U1 = u1.As<User>(), 
     U2 = u2.As<User>(), 
     U3 = u3.As<User>() 
    }); 

Я не знаю, что там будет только ответы «3», не может быть гораздо больше или даже меньше. Любые идеи о том, как достичь этого? Или как есть, либо совершенно по-другому, я открыт для всех вариантов.

Я хотел бы что-то вроде:

query.Return<User>("u1", "u2", "u3"); //returning IEnumerable<User> 

или, может быть:

query.Return<User>("u1").AndReturn("u2").AndReturn("u3"); 

Я знаю, что могу вернуться к этим запросам вызова БД непосредственно через HttpClient или некоторые такие, но я Если не ошибаюсь, избегайте этого. Честно говоря, я был бы доволен разбором их всех до dynamic, но в настоящее время это невозможно (или это ??? :)).

ответ

2

Neo4jClient не имеет хороших решений для динамических форм возврата, подобных этому.

В этом надуманном примере, по крайней мере, вы можете просто сгладить узлы в один список?

.Return<IEnumerable<User>>("[u1, u2, u3]") 

Вы можете легко сказать, что есть что с Id свойством, что вы используете в пункте WHERE но также будут доступны в C#.

+0

К сожалению, нет ошибки в коде для '', что приводит к исключению: «Перегрузка, которую вы вызывали, принимает идентификатор (например: foo), но похоже, что вы пытались пройти (например: foo, bar) « –

+0

Однако, если я пропущу это в отладчике, он работает как ожидалось, я положу запрос на извлечение с исправлением ... –

+0

Вы могли бы сделать. Возврат (() => new {Users = Return.As > ("[u1, u2, u3]")}). Результаты. ВыберитеMany (r => r.Users) как неуклюжий обходной путь. :) –