C# 扩展NHibernate Linq提供程序

C# 扩展NHibernate Linq提供程序,c#,linq,nhibernate,linq-to-nhibernate,C#,Linq,Nhibernate,Linq To Nhibernate,是否有人可以提供一些示例来扩展Hibernate Linq Provider,以请求任何字段[等于| lt | gt | notEquals…]某些值。即: this.session.Query<C>.Where(c => c.WhichEverField().Equals(1)); this.session.Query.Where(c=>c.WhichEverField().Equals(1)); 其中WhichEverField()将是一个扩展方法 有什么想法吗?这是我

是否有人可以提供一些示例来扩展Hibernate Linq Provider,以请求
任何字段[等于| lt | gt | notEquals…]某些值
。即:

this.session.Query<C>.Where(c => c.WhichEverField().Equals(1));
this.session.Query.Where(c=>c.WhichEverField().Equals(1));
其中
WhichEverField()
将是一个扩展方法


有什么想法吗?

这是我曾经编写的一个类,它允许您在查询中使用Convert.ToInt64()

public class ConvertToInt64HqlGenerator : BaseHqlGeneratorForMethod
{
    public ConvertToInt64HqlGenerator()
        : base()
    {
        this.SupportedMethods = new[] { ReflectionHelper.GetMethodDefinition(() => Convert.ToInt64("")),
                                        ReflectionHelper.GetMethodDefinition(() => Convert.ToInt64(0)),
                                        ReflectionHelper.GetMethodDefinition(() => Convert.ToInt64(0M))};
    }

    public override HqlTreeNode BuildHql(MethodInfo method,
                                            Expression targetObject,
                                            ReadOnlyCollection<Expression> arguments,
                                            HqlTreeBuilder treeBuilder,
                                            IHqlExpressionVisitor visitor)
    {
        return treeBuilder.Cast(visitor.Visit(arguments[0]).AsExpression(),typeof(Int64));
    }
}
并将其添加到您的配置中:

Fluently.Configure().Database(msSQLconfig)
                    .ExposeConfiguration(c => c.LinqToHqlGeneratorsRegistry<MyLinqToHqlGeneratorsRegistry>())
fluntly.Configure().Database(msSQLconfig)
.ExposeConfiguration(c=>c.LinqToHqlGeneratorsRegistry())

如果这些扩展中的任何一种允许您实现您的目标,您可以在这些扩展中进行检查

但如果我正确理解了你的问题,我怀疑这是可行的。我不知道有任何db语法处理“哪一列”语义,因此我不知道如何将具有这种语义的
LINQ
扩展转换为也具有这种语义的SQL查询(这还需要
HQL
扩展,因为将
LINQ
查询转换为
HQL

如果您打算通过在
LINQ
扩展中生成多个
比较标准来直接处理该语义,那么使用您建议的
c.WhichEverField().Equals(1)

不仅如此,你还必须使用类似的东西。但是您还必须在
BuildHql
方法内部对参数和非平凡的
HqlTree
构建进行类型检查。
然后,它将失败,因为在
BuildHql
方法将被调用为您定义的
扩展名WhichEverField
时,您将不知道必须对操作数进行哪些比较

也许使用
c.WhichEverField(somecomparisonTypenum.Equal,1)
扩展,您可以处理这个问题,但这无论如何都不是一件容易的事。
如果这可能有帮助,您可以找到更多的扩展示例(从我这里)和其他链接,但没有一个具有您需求的复杂程度

Fluently.Configure().Database(msSQLconfig)
                    .ExposeConfiguration(c => c.LinqToHqlGeneratorsRegistry<MyLinqToHqlGeneratorsRegistry>())