C# 动态更改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>()

我想实现NHibernate根据条件查询不同的类型。假设条件为
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>();
}