【问题标题】:Dynamically change query type in NHibernate在 NHibernate 中动态更改查询类型
【发布时间】:2018-11-27 00:54:06
【问题描述】:

我想实现 NHibernate 基于条件查询不同类型。假设条件是false,那么查询应该如下所示:

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

当条件为真时,它应该是这样的:

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

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

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

提前致谢:-)

【问题讨论】:

    标签: c# sql nhibernate


    【解决方案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

    您将能够同时操作这两种类型。

    【讨论】:

      【解决方案2】:

      您提供的代码很少表明任何已确认的内容。

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

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

      【讨论】:

        猜你喜欢
        • 2018-04-16
        • 1970-01-01
        • 1970-01-01
        • 2013-05-02
        • 2018-12-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-07
        相关资源
        最近更新 更多