在Fluent NHibernate中,是否可以将参数添加到List< int>类型的过滤器中.以便过滤条件生成WHERE SomeColumn IN(@x,@ y,@ z)?
我的用例是根据发票的ID和发票行号列表获取发票及其行的子集.我想急切地在与发票相同的往返途中获取线路.我假设它是这样做的,但我找不到参数类型的正确类型声明:
域对象:
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;} }
映射:
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); } }
过滤器定义:
public class OnlyLinesWithNumbersFilter : FilterDefinition { public OnlyLinesWithNumbersFilter() { WithName("OnlyLinesWithNumbers"); WithCondition("LineNumber IN (:LineNumbers)"); AddParameter("LineNumbers",?? What to put here ??); } }
查询:
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);
解决方法
就拿-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,3 }) .List();
制作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)]