【发布时间】:2016-02-02 01:30:25
【问题描述】:
我使用流利的 NHibernate,我需要随机化查询的结果,我想要的是这样的:
select * from table order by newid()
方法,应该是扩展 NHibernate IQueryable 生成器以使用像 QueryableExtension.RandomOrder<T>(this IQueryable<T> list) 这样的方法
这里的博客:http://fabiomaulo.blogspot.dk/2010/07/nhibernate-linq-provider-extension.html 还有这个:Extending LINQ to Nhibernate provider, in combination with Dynamic LINQ problem
我写了这段代码:
public class RandomOrderGenerator : BaseHqlGeneratorForMethod
{
public RandomOrderGenerator()
{
SupportedMethods = new[]
{
ReflectionHelper.GetMethod(() => Enumerable.Empty<object>().AsQueryable().RandomOrder()),
ReflectionHelper.GetMethod(() => Enumerable.Empty<long>().AsQueryable().RandomOrder()),
};
}
public override HqlTreeNode BuildHql(MethodInfo method, System.Linq.Expressions.Expression targetObject, ReadOnlyCollection<System.Linq.Expressions.Expression> arguments,
HqlTreeBuilder treeBuilder, IHqlExpressionVisitor visitor)
{
throw new NotImplementedException();
}
}
public class MyLinqToHqlGeneratorsRegistry : DefaultLinqToHqlGeneratorsRegistry
{
public MyLinqToHqlGeneratorsRegistry()
{
RegisterGenerator(ReflectionHelper.GetMethod(() => Enumerable.Empty<object>().AsQueryable().RandomOrder()), new RandomOrderGenerator());
}
}
我已配置为使用MyLinqToHqlGeneratorsRegistry,它被创建,我的RandomOrderGenerator 被创建,但BuildHql 方法从未被调用。
扩展的使用:
repository.Query<Table>().Take(10).RandomOrder().Select(x => x.Id);
SupportMethods 和 RegisterGenerator 方法定义应该是一样的,但是为什么我不能让它生成 HQL?
【问题讨论】:
标签: c# linq nhibernate fluent-nhibernate extension-methods