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提供程序