I\'m using NHibernate 3.1.0 and I\'m trying to extend the LINQ provider by using BaseHqlGeneratorForMethod
and extending the DefaultLinqToHqlGeneratorsReg
I had the same problem and fixed it.
At first I want to thank murki for providing the information which got me on my way!
The answer lies partly in Fabio's post. To solve this issue you have to use the RegisterGenerator
instead of the Merge
method in the CustomLinqToHqlGeneratorsRegistry
constructor. My implementation of the CustomLinqToHqlGeneratorsRegistry
class is as follows:
public class CustomLinqToHqlGeneratorsRegistry : DefaultLinqToHqlGeneratorsRegistry
{
public CustomLinqToHqlGeneratorsRegistry()
: base()
{
MethodInfo toStringMethod = ReflectionHelper.GetMethodDefinition<int>(x => x.ToString());
RegisterGenerator(toStringMethod, new ToStringGenerator());
}
}
Supposing the property Id
of the class Project
it's an Int32
try registering the corresponding Int32.ToString()
method in your ToStringGenerator
class.
...
public ToStringGenerator()
{
SupportedMethods = new[]
{
ReflectionHelper.GetMethodDefinition<object>(x => x.ToString()),
ReflectionHelper.GetMethodDefinition<int>(x => x.ToString()),
};
}
...
There are two, well defined, separate stages here:
Since you have determined that a static expression works well, the problem lies in 1.
What happens if you do the following?
var results = Enumerable.Empty<Project>().AsQueryable();
string pId = "1";
results = results.Where("Id.ToString().Contains(@0)", pId);
If it fails, you'll have confirmed it's a problem with Dynamic Linq alone (i.e. it doesn't support the expression you're feeding it), so you'll have to dig into it and patch it.
Semi-related: the ToStringGenerator
looks useful; could you submit a patch for NHibernate? http://jira.nhforge.org