C# NHibernate:有没有办法从标准中获取HQL或SQL?

C# NHibernate:有没有办法从标准中获取HQL或SQL?,c#,sql,nhibernate,hql,C#,Sql,Nhibernate,Hql,我认为有时我们希望从标准中获得HQL或SQL。以以下为例: 假设我们要删除ID列表中类型为T的所有对象: public class Repostiroy<T> { public void Delete(object[] ids){...} } 问题是如何实现ToHQL和ToSQL 更新 同样的方法也可以应用于会话。查询,您可以使用NHibernate Linq Provider为您创建HQL和或SQL,通过查看NHibernate的引擎盖,我成功地编写了两个标准扩展:

我认为有时我们希望从标准中获得
HQL
SQL
。以以下为例: 假设我们要删除ID列表中类型为T的所有对象:

public class Repostiroy<T>
{
     public void Delete(object[] ids){...}

}
问题是如何实现
ToHQL
ToSQL

更新


同样的方法也可以应用于
会话。查询
,您可以使用
NHibernate Linq Provider
为您创建
HQL
和或
SQL
,通过查看NHibernate的引擎盖,我成功地编写了两个标准扩展:

toisql命令:

public static IEnumerable<ISqlCommand> ToISqlCommands(this ICriteria criteria)
        {
            var criteriaImp = criteria as CriteriaImpl;
            if (criteriaImp == null)
                throw new InvalidOperationException();
            var implementors = criteriaImp.Session.Factory.GetImplementors(criteriaImp.EntityOrClassName);
            var loaders = new CriteriaLoader[implementors.Length];
            for (var i = 0; i < implementors.Length; i++)
            {
                loaders[i] = new CriteriaLoader((IOuterJoinLoadable) typeof(SessionImpl).GetMethod("GetOuterJoinLoadable",BindingFlags.Instance | BindingFlags.NonPublic).Invoke(criteriaImp.Session,new object[]{implementors[i]}), criteriaImp.Session.Factory, criteriaImp, implementors[i], criteriaImp.Session.EnabledFilters);
            }

            return
                loaders.Select(
                    loader => loader.CreateSqlCommand(loader.Translator.GetQueryParameters(), criteriaImp.Session));
        }
public static IEnumerable<IDbCommand> ToIDbCommands(this ICriteria criteria)
        {
             var criteriaImp = criteria as CriteriaImpl;
            if (criteriaImp == null)
                throw new InvalidOperationException();
            var implementors = criteriaImp.Session.Factory.GetImplementors(criteriaImp.EntityOrClassName);
            var loaders = new CriteriaLoader[implementors.Length];
            for (var i = 0; i < implementors.Length; i++)
            {
                loaders[i] = new CriteriaLoader((IOuterJoinLoadable) typeof(SessionImpl).GetMethod("GetOuterJoinLoadable",BindingFlags.Instance | BindingFlags.NonPublic).Invoke(criteriaImp.Session,new object[]{implementors[i]}), criteriaImp.Session.Factory, criteriaImp, implementors[i], criteriaImp.Session.EnabledFilters);
            }

            return
                loaders.Select(
                    loader => (IDbCommand)loader.GetType().GetMethod("PrepareQueryCommand", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(loader,new object[]{ loader.Translator.GetQueryParameters(),false, criteriaImp.Session}));
        }
公共静态IEnumerable-ToISqlCommands(此ICriteria标准)
{
var criteriaImp=作为CriteriaImpl的标准;
if(criteriaImp==null)
抛出新的InvalidOperationException();
var implementors=criteriaImp.Session.Factory.GetImplementors(criteriaImp.EntityOrClassName);
var loaders=newcriterialoader[implementors.Length];
for(var i=0;iloader.CreateSqlCommand(loader.Translator.GetQueryParameters(),criteriaImp.Session));
}
toidbcomnads:

public static IEnumerable<ISqlCommand> ToISqlCommands(this ICriteria criteria)
        {
            var criteriaImp = criteria as CriteriaImpl;
            if (criteriaImp == null)
                throw new InvalidOperationException();
            var implementors = criteriaImp.Session.Factory.GetImplementors(criteriaImp.EntityOrClassName);
            var loaders = new CriteriaLoader[implementors.Length];
            for (var i = 0; i < implementors.Length; i++)
            {
                loaders[i] = new CriteriaLoader((IOuterJoinLoadable) typeof(SessionImpl).GetMethod("GetOuterJoinLoadable",BindingFlags.Instance | BindingFlags.NonPublic).Invoke(criteriaImp.Session,new object[]{implementors[i]}), criteriaImp.Session.Factory, criteriaImp, implementors[i], criteriaImp.Session.EnabledFilters);
            }

            return
                loaders.Select(
                    loader => loader.CreateSqlCommand(loader.Translator.GetQueryParameters(), criteriaImp.Session));
        }
public static IEnumerable<IDbCommand> ToIDbCommands(this ICriteria criteria)
        {
             var criteriaImp = criteria as CriteriaImpl;
            if (criteriaImp == null)
                throw new InvalidOperationException();
            var implementors = criteriaImp.Session.Factory.GetImplementors(criteriaImp.EntityOrClassName);
            var loaders = new CriteriaLoader[implementors.Length];
            for (var i = 0; i < implementors.Length; i++)
            {
                loaders[i] = new CriteriaLoader((IOuterJoinLoadable) typeof(SessionImpl).GetMethod("GetOuterJoinLoadable",BindingFlags.Instance | BindingFlags.NonPublic).Invoke(criteriaImp.Session,new object[]{implementors[i]}), criteriaImp.Session.Factory, criteriaImp, implementors[i], criteriaImp.Session.EnabledFilters);
            }

            return
                loaders.Select(
                    loader => (IDbCommand)loader.GetType().GetMethod("PrepareQueryCommand", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(loader,new object[]{ loader.Translator.GetQueryParameters(),false, criteriaImp.Session}));
        }
公共静态IEnumerable ToIDbCommands(此ICriteria标准)
{
var criteriaImp=作为CriteriaImpl的标准;
if(criteriaImp==null)
抛出新的InvalidOperationException();
var implementors=criteriaImp.Session.Factory.GetImplementors(criteriaImp.EntityOrClassName);
var loaders=newcriterialoader[implementors.Length];
for(var i=0;i(IDbCommand)loader.GetType().GetMethod(“PrepareQueryCommand”,BindingFlags.Instance | BindingFlags.NonPublic).Invoke(loader,新对象[]{loader.Translator.GetQueryParameters(),false,criteriaImp.Session});
}
这些扩展不是我真正想要的,但它们可以完成这项工作。
ISqlCommand
是一个
NHibernate
接口,其中包含sql查询及其查询参数定义

更新

仍在使用NHibernate Linq提供程序