Question

I'm working with the Neo4jClient for C# and it works brilliantly ! Thanks Tatham Oddie.

At runtime, I need to return different results based on some criteria though. I see Return is defined and overloaded as basically:

ICypherFluentQuery<TResult> Return<TResult>(Expression<Func<ICypherResultItem, TResult>> expression);

Since TResult is a templated param, I'm not sure how I could create a Func<> that I can pass to .Return

Ideally, I'd like to do something like this:

Func<ICypherResultItem, User> returnCode = (user) => new { u = user.As<User> } ;

var query = client
    .Cypher
    .Start(new { root = client.RootNode })
    .Match("root-[:HAS_BOOK]->user");
    .Return(   returnCode );

Is this possible ? How can I declare the Func<> to pass to Return ?

Was it helpful?

Solution

Declare your returnCode variable as Expression<>> and compiler will generate expression for you:

When a lambda expression is assigned to a variable, field, or parameter whose type is Expression<TDelegate>, the compiler emits instructions to build an expression tree.

from Expression Class

But because your lambda returns anonymous type, instead of User class instance, your Func<T, TRresult> generic parameter does not match. Try with following:

Expression<Func<ICypherResultItem, User>> returnCode = (user) => user.As<User>;
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top