FluentNHibernate滤波器的参数化IN子句 [英] FluentNHibernate filter with parameterized IN clause

查看:120
本文介绍了FluentNHibernate滤波器的参数化IN子句的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在功能NHibernate,是否有可能添加参数类型的过滤器名单,其中,INT> 这样的过滤条件生成一个 WHERE SomeColumn IN(@x,@y,@z)

我的使用情形是取发票和它的线的子集,考虑到发票的ID和发票行号的列表。我想在同一个往返的发票预先抓取线。我想这是做这样的事情,但我不能找到正确的类型声明的参数类型:

域对象:

 公共类发票{
  公众诠释编号{获取;集;}
  公开名单< InvoiceLine>行{获取;集;}
}

公共类InvoiceLine {
  公众诠释编号{获取;集}
  公众诠释LINENUMBER {获取;集;}
}
 

映射:

 公共类InvoiceMap:ClassMap<发票> {
  公共InvoiceMap(){
    ID(X => x.Id);
    的hasMany(X => x.Lines).ApplyFilter< OnlyLinesWithNumbersFilter>();
  }
}

公共类InvoiceLineMap:ClassMap< InvoiceLine> {
  公共InvoiceLineMap(){
    ID(X => x.Id);
    地图(X => x.LineNumber);
  }
}
 

过滤器定义:

 公共类OnlyLinesWithNumbersFilter:FilterDefinition
{
    公共OnlyLinesWithNumbersFilter()
    {
        WithName(OnlyLinesWithNumbers);
        WithCondition(LINENUMBER IN(:LineNumbers));
        AddParameter(LineNumbers,??怎么把这里?);
    }
}
 

查询:

  VAR FILTERNAME =OnlyLinesWithNumbers;
session.EnableFilter(FILTERNAME).SetParameterList(LineNumbers,新的[] {1,2,3});

VAR的查询= session.QueryOver<发票>()
       。凡(I => i.Id == 42)
       .Fetch(I => i.Lines).Eager
       .TransformUsing(新DistinctRootEntityResultTransformer());

VAR的结果= query.SingleOrDefault();
session.DisableFilter(FILTERNAME);
 

解决方案

取-2

  InvoiceLine invoiceLineAlias​​ = NULL;
VAR列表= session.QueryOver<发票>()
                  。凡(X => x.Id == 1)
                  .JoinQueryOver(X => x.Lines,()=> invoiceLineAlias​​,JoinType.LeftOuterJoin)
                  .WhereRestrictionOn(()=> invoiceLineAlias​​.LineNumber)
                  .IsIn(新列表与所述; INT> {1,2,3})
                  的.List();
 

产生的SQL:

  SELECT
        this_.Id为Id2_1_,
        invoicelin1_.Invoice_id为Invoice3_3_,
        invoicelin1_.Id为Id3_,
        invoicelin1_.Id为Id3_0_,
        invoicelin1_.LineNumber为LineNumber3_0_
    从
        发票THIS_
    左外连接
        InvoiceLineinvoicelin1_
            在this_.Id = invoicelin1_.Invoice_id
    哪里
        this_.Id = @ P0
        和invoicelin1_.LineNumber在(
            @ P1,P2 @,@ P3
        );
    @ P0 = 1 [类型:的Int32(0)],
    @ P1 = 1 [类型:的Int32(0)],
    @ P2 = 2 [类型:的Int32(0)],
    @ P3 = 3 [类型:的Int32(0)]
 

In Fluent NHibernate, is it possible to add a parameter to a filter of type List<int> so that the filter condition generates a WHERE SomeColumn IN (@x, @y, @z) ?

My use case is to fetch an invoice and a subset of its lines, given the ID of the invoice and a list of invoice line numbers. I want to eager fetch the lines in the same roundtrip as the invoice. I assume it is done something like this, but I cannot find the correct type declaration for the parameter type:

Domain objects:

public class Invoice {
  public int Id {get;set;}
  public List<InvoiceLine> Lines {get;set;}
}

public class InvoiceLine {
  public int Id {get;set}
  public int LineNumber {get;set;}
}

Mappings:

public class InvoiceMap : ClassMap<Invoice> {
  public InvoiceMap() {
    Id(x => x.Id);
    HasMany(x => x.Lines).ApplyFilter<OnlyLinesWithNumbersFilter>();
  }
}

public class InvoiceLineMap : ClassMap<InvoiceLine> {
  public InvoiceLineMap() {
    Id(x => x.Id);
    Map(x => x.LineNumber);
  }
}

Filter definition:

public class OnlyLinesWithNumbersFilter : FilterDefinition
{
    public OnlyLinesWithNumbersFilter()
    {
        WithName("OnlyLinesWithNumbers");
        WithCondition("LineNumber IN (:LineNumbers)");
        AddParameter("LineNumbers",?? What to put here ??);
    }
}

Query:

var filterName = "OnlyLinesWithNumbers";
session.EnableFilter(filterName).SetParameterList("LineNumbers", new[] {1,2,3});

var query = session.QueryOver<Invoice>()
       .Where(i => i.Id == 42)
       .Fetch(i => i.Lines).Eager
       .TransformUsing(new DistinctRootEntityResultTransformer());

var result = query.SingleOrDefault();
session.DisableFilter(filterName);

解决方案

Take-2

InvoiceLine invoiceLineAlias = null;
var list = session.QueryOver<Invoice>()
                  .Where(x => x.Id == 1)
                  .JoinQueryOver(x => x.Lines, () => invoiceLineAlias, JoinType.LeftOuterJoin)
                  .WhereRestrictionOn(() => invoiceLineAlias.LineNumber)
                  .IsIn(new List<int> { 1, 2, 3 })
                  .List();

produced sql:

SELECT
        this_.Id as Id2_1_,
        invoicelin1_.Invoice_id as Invoice3_3_,
        invoicelin1_.Id as Id3_,
        invoicelin1_.Id as Id3_0_,
        invoicelin1_.LineNumber as LineNumber3_0_
    FROM
        "Invoice" this_
    left outer join
        "InvoiceLine" invoicelin1_
            on this_.Id=invoicelin1_.Invoice_id
    WHERE
        this_.Id = @p0
        and invoicelin1_.LineNumber in (
            @p1, @p2, @p3
        );
    @p0 = 1 [Type: Int32 (0)], 
    @p1 = 1 [Type: Int32 (0)], 
    @p2 = 2 [Type: Int32 (0)], 
    @p3 = 3 [Type: Int32 (0)]

这篇关于FluentNHibernate滤波器的参数化IN子句的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆