在 NHibernate 中动态更改查询类型
Dynamically change query type in NHibernate
我想实现 NHibernate 根据条件查询不同的类型。假设条件是 false
那么查询应该是这样的:
var myVar = session.Query<TypeWhenFalse>()
.Where(a => condition)
当条件为真时,它应该如下所示:
var myVar = session.Query<TypeWhenTrue>()
.Where(a => condition)
请注意不同的查询类型 TypeWhenFalse
和 TypeWhenTrue
。由于代码重复,我不想使用 if
子句来设置不同的类型。
有没有办法动态地执行此操作以避免 if
子句?在互联网上找不到任何有用的信息。
提前致谢:-)
您提供的代码不足以建议任何已确认的内容。
您可以使用泛型轻松实现这一点。我的意思是,使这个函数通用并从外部传递通用类型。这应该可以解决您的顾虑。
public yourtype GetData<T>()
{
var myVar = session.Query<T>()
.Where(a => condition);
return myVar;//or whatever
}
和您的调用代码:
if(false)
myVar = GetData<TypeWhenFalse>();
else
myVar = GetData<TypeWhenTrue>();
正如你所说,你不想使用if...else
以避免冗余代码。如果您同意很少冗余,请考虑以下解决方案:
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>();
}
关于泛型类型的更多信息:C# generic types
有关接口的更多信息:Interfaces
如果您为这两种类型都实现了一个接口,则可以键入生成的 Iqueryable 作为接口。该方法将是 IQueryable ConvertExtension
并且您将能够像它一样操作这两种类型。
我想实现 NHibernate 根据条件查询不同的类型。假设条件是 false
那么查询应该是这样的:
var myVar = session.Query<TypeWhenFalse>()
.Where(a => condition)
当条件为真时,它应该如下所示:
var myVar = session.Query<TypeWhenTrue>()
.Where(a => condition)
请注意不同的查询类型 TypeWhenFalse
和 TypeWhenTrue
。由于代码重复,我不想使用 if
子句来设置不同的类型。
有没有办法动态地执行此操作以避免 if
子句?在互联网上找不到任何有用的信息。
提前致谢:-)
您提供的代码不足以建议任何已确认的内容。
您可以使用泛型轻松实现这一点。我的意思是,使这个函数通用并从外部传递通用类型。这应该可以解决您的顾虑。
public yourtype GetData<T>()
{
var myVar = session.Query<T>()
.Where(a => condition);
return myVar;//or whatever
}
和您的调用代码:
if(false)
myVar = GetData<TypeWhenFalse>();
else
myVar = GetData<TypeWhenTrue>();
正如你所说,你不想使用if...else
以避免冗余代码。如果您同意很少冗余,请考虑以下解决方案:
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>();
}
关于泛型类型的更多信息:C# generic types 有关接口的更多信息:Interfaces
如果您为这两种类型都实现了一个接口,则可以键入生成的 Iqueryable 作为接口。该方法将是 IQueryable ConvertExtension
并且您将能够像它一样操作这两种类型。