C# 动态更改NHibernate中的查询类型
我想实现NHibernate根据条件查询不同的类型。假设条件为C# 动态更改NHibernate中的查询类型,c#,sql,nhibernate,C#,Sql,Nhibernate,我想实现NHibernate根据条件查询不同的类型。假设条件为false,则查询应如下所示: var myVar = session.Query<TypeWhenFalse>() .Where(a => condition) var myVar=session.Query() .其中(a=>条件) 当条件为真时,应如下所示: var myVar = session.Query<TypeWhenTrue>()
false
,则查询应如下所示:
var myVar = session.Query<TypeWhenFalse>()
.Where(a => condition)
var myVar=session.Query()
.其中(a=>条件)
当条件为真时,应如下所示:
var myVar = session.Query<TypeWhenTrue>()
.Where(a => condition)
var myVar=session.Query()
.其中(a=>条件)
注意不同的查询类型TypeWhenFalse
和TypeWhenTrue
。由于代码重复,我不想使用if
子句来设置不同的类型
是否有一种方法可以动态执行此操作,以避免出现if
子句?在互联网上找不到任何有用的东西
提前感谢:-)您提供的代码很少建议确认任何内容 您可以使用泛型轻松实现这一点。我的意思是,将这个函数设置为泛型,并从外部传递泛型类型。这应该能解决你的担忧
public yourtype GetData<T>()
{
var myVar = session.Query<T>()
.Where(a => condition);
return myVar;//or whatever
}
您必须使用泛型类型方法,并且可以使用扩展来实现所需的功能 但是。。为了使这一点有意义,您需要让两个返回类型都具有由接口实现的公共结构 请参见此示例:
public static void Main()
{
var abc = new List<long>(){ 1,2,3,4};
var result = abc.AsQueryable().ConvertExtension();
}
public static IQueryable ConvertExtension<T>(this IQueryable<T> source, bool condition=false)
{
return condition
? (IQueryable) source.Select(x => x.ToString()).AsQueryable<string>()
: source.Select(x => int.Parse(x.ToString())).AsQueryable<int>();
}
publicstaticvoidmain()
{
var abc=新列表(){1,2,3,4};
var result=abc.AsQueryable().ConvertExtension();
}
公共静态IQueryable ConvertExtension(此IQueryable源,bool条件=false)
{
返回条件
?(IQueryable)源。选择(x=>x.ToString()).AsQueryable()
:source.Select(x=>int.Parse(x.ToString()).AsQueryable();
}
有关泛型类型的详细信息:
有关接口的更多信息:
如果为这两种类型实现接口,则可以将生成的Iqueryable作为接口。该方法将是IQueryable可转换扩展
您可以按原样操作这两种类型
var query;
if(false)
query = session.Query<TypeWhenFalse>();
else
query = session.Query<TypeWhenTrue>();
var myVar = query.Where(a => condition);
public static void Main()
{
var abc = new List<long>(){ 1,2,3,4};
var result = abc.AsQueryable().ConvertExtension();
}
public static IQueryable ConvertExtension<T>(this IQueryable<T> source, bool condition=false)
{
return condition
? (IQueryable) source.Select(x => x.ToString()).AsQueryable<string>()
: source.Select(x => int.Parse(x.ToString())).AsQueryable<int>();
}