在NHibernate中动态更改查询类型

时间:2018-06-18 08:01:43

标签: c# sql nhibernate

我想实现NHibernate根据条件查询不同的类型。假设条件为false,则查询应如下所示:

var myVar = session.Query<TypeWhenFalse>()
                 .Where(a => condition)

当条件为真时,它应该如下所示:

var myVar = session.Query<TypeWhenTrue>()
                 .Where(a => condition)

请注意不同的查询类型TypeWhenFalseTypeWhenTrue。由于代码重复,我不想使用if子句来设置不同的类型。

有没有办法动态地执行此操作以避免if子句?在互联网上找不到任何有用的东西。

提前致谢: - )

2 个答案:

答案 0 :(得分:1)

您提供的代码非常少,无法提出任何已确认的内容。

您可以使用泛型来轻松实现此目的。我的意思是,使这个函数通用,并从外部传递泛型类型。这应该可以解决您的问题。

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);

答案 1 :(得分:1)

您必须使用泛型类型方法,并且可以使用扩展来实现您想要的内容。

但是......为了让它有意义,你需要让两个返回的类型都有一个接口实现的通用结构。

见这个例子:

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

你可以操纵这两种类型。