【亚洲必赢官网】并做为参数字传送入泛型方法中运用,条件查询

干活中有那样一个供给,有N张不一样的报表,每张报表对应多个数据源,总结数据采纳内部存款和储蓄器格局,首先在内在里定义了数据源对应实体。总结口径用lamdba表明式式完成,通过工具对单元格进行定义。在落到实处进程中针对每一张表来写取数字展现示是很Low的了,取数条件定义都是规则的,总结达成正是1段C#代码,不过要对准差别的数据源也正是例外的List<Entity>,通过研商发现经过泛型和反光能够兑现。

一.常用控件

亚洲必赢官网 1文本框:输入文字或表明式

亚洲必赢官网 2报表:设置表格的队列数,输入数字或表明式

亚洲必赢官网 3子报表:放置子报表后,系统会自动扩充一个页面,你能够在此页面上统一筹划要求的表格。系统在打字与印刷处理时,先按主报表打印,当遇到子报表时会自动转入子报表的页面进行打字与印刷处理,达成后接二连三执行主报表打字与印刷的做事,所以大家又叫做嵌套报表。

亚洲必赢官网 4复选框:依据布尔表明式是还是不是为ture来显示是还是不是 √

亚洲必赢官网 5条形码:绑定扫描码,一般Type为Code12八

亚洲必赢官网 6交叉表:Matrix

亚洲必赢官网 7页面设置:设置纸张大小及页边距

亚洲必赢官网 8边框设置:设置是不是出示上下左左边框以及边框线条的装置

亚洲必赢官网 9边框宽度:下拉三角能够选拔边框宽度设置

非类型化的标准化查询

小编们从概念规则查询的根开端,代码如下所示:

var query = session.CreateCriteria<Product>();

CreateCriteria方法再次来到四个贯彻了ICriteria接口的指标。若是得到具有成品的列表,那么大家必要接纳接口ICriteria的List<T>方法,如上边包车型大巴代码所示:

var products = session.CreateCriteria<Product>().List<Product>();

List<Product>()方法重返IList<Product>。和LINQ to
NHibernate相比较,当List方法被调用时查询立时执行。

自然还有一个非泛型的List法兰西共和国法定义在ICriteria接口上。那么些点子重回三个IList类型的目标。

1.常用控件

 

   
  亚洲必赢官网 10文本框:输入文字或表明式

   
  亚洲必赢官网 11报表:设置表格的队列数,输入数字或表明式

     
亚洲必赢官网 12子报表:放置子报表后,系统会自动扩张多少个页面,你能够在此页面上统一筹划供给的表格。系统在打印处理时,先按主报表打字与印刷,当遭逢子报表时会自动转入子报表的页面进
     
行打字与印刷处理,完结后一而再执行主报表打字与印刷的干活,所以大家又称之为嵌套报表。

   
  亚洲必赢官网 13复选框:依照布尔表明式是或不是为ture来显示是不是 √(如性别男女)

   
  亚洲必赢官网 14条形码:绑定扫描码(如静滴单),壹般Type为Code12八 

           
  亚洲必赢官网 15交叉表:Matrix

     
     
  亚洲必赢官网 16页面设置:设置纸张大小及页边距

     
     
  亚洲必赢官网 17边框设置:设置是或不是出示上下左右侧框以及边框线条的安装

     
     
  亚洲必赢官网 18边框宽度:下拉三角能够挑选边框宽度设置

 

依据字符串获取实体类型

二.常用报表栏

报表标题区(ReportTitle):仅在首先页展现在纸张的上部。1般用于打字与印刷表格的标题等消息。

报表合计(ReprotSummary):仅展现在具备数据的末段末尾。壹般用来打字与印刷总计新闻等。

页眉(PageHeader):展现在每页的最上部。通过安装你能够让它放到报表抬头之上只怕之下。一般用来打字与印刷页眉新闻等。

数据区:绑定数据源展现数据。

数据首:展现在拥有数据源的最上部,仅打字与印刷一遍。①般用于展示相关摘要信息,与页眉的分别是当该页无数据时,数据首的情节不显得且仅展示3遍。

数据尾:展现在颇具数据源的最下边,仅打字与印刷贰次。一般用于展示全体数据的磋商音讯。

亚洲必赢官网,栏首(ColumnHeader):展现在每页数据源的上部,它在每页均显得。由此1般用来打印数据源字段的栏目音讯。

栏尾(ColumnHeader):展现在每页数据源的下面,它在每页均突显。1般可用以总括显示每页数据的页合计信息。

分组页眉(GroupHeader):用于展现分组数据,在每3个分组起首展现。

分组页脚(GroupFooter):与群组首1壹对应。壹般用于展现分组数据的总括音讯。

页脚(PageFooter):呈现在每页的最尾部。一般用来打字与印刷页序等音讯。

限定再次回到的记录数

界定查询重回的记录数,能够使用Set马克斯Results方法。从数据库中获得前十三个产品,代码如下:

var first10Products = session.CreateCriteria<Product>()
                       .SetMaxResults(10)
                       .List<Product>();

二.常用报表栏

      

报表标题区(ReportTitle):仅在率先页突显在纸张的上部。壹般用来打字与印刷表格的题目等新闻。

 

报表合计(ReprotSummary):仅映未来享有数据的最后末尾。一般用于打印总计新闻等。

 

页眉(PageHeader):呈现在每页的最上部。通过设置你能够让它内置报表抬头之上可能之下。1般用于打印页眉新闻等。

 

数据区(data):绑定数据源突显数据。

 

数量首(Header):显示在颇具数据源的最上部,仅打字与印刷一回。一般用于展现相关摘要消息,与页眉的界别是当该页无数据时,数据首的始末不出示且仅突显3遍。

 

数据尾(Footer):展现在有着数据源的最下边,仅打字与印刷二次。一般用来展现全体数据的商业事务消息。

 

栏首(ColumnHeader):展现在每页数据源的上部,它在每页均展现。由此一般用于打字与印刷数据源字段的栏目消息。

 

栏尾(ColumnHeader):显示在每页数据源的底下,它在每页均显得。一般可用以计算彰显每页数据的页合计消息。

 

分组页眉(GroupHeader):用于体现分组数据,在每2个分组初阶显得。

 

分组页脚(GroupFooter):与群组首一1对应。一般用来突显分组数据的总结音信。

 

页脚(PageFooter):展现在每页的最尾巴部分。一般用来打字与印刷页序等信息。

 

 1 private Type getEntity(string typeName)
 2 {
 3     var workPath = AppDomain.CurrentDomain.BaseDirectory;
 4     string[] files = Directory.GetFiles(workPath, "XXX.Utils.dll", SearchOption.TopDirectoryOnly);
 5     foreach (string file in files)
 6     {
 7         string ext = file.Substring(file.LastIndexOf("."));
 8         if (ext != ".dll") continue;
 9         try
10         {
11             Assembly asm = Assembly.LoadFile(file);
12             Type[] allTypes = asm.GetTypes();
13             foreach (Type t in allTypes)
14             {
15                 if (t.IsSubclassOf(typeof(XXDataRecord)))
16                 {
17                     if (t.Name.ToUpper().IsSame(typeName.ToUpper()))
18                         return t;
19                 }
20             }
21         }
22         catch
23         {
24             return null;
25         }
26     }
27     return null;
28 }

3.常用效应

筛选记录集

假诺筛选出下架的出品,代码如下所示:

var discontinuedProducts = session.CreateCriteria<Product>()
                           .Add(Restrictions.Eq("Discontinued", true))
                           .List<Product>();

通过给查询添加1个或多少个限制条件筛选就完了了。即便大家想获取全部必要再订购的在架产品列表,大家得以选择上面包车型客车代码:

var discontinuedProducts = session.CreateCriteria<Product>()
                           .Add(Restrictions.Eq("Discontinued", false))
                           .Add(Restrictions.GeProperty("ReorderLevel", "UnitsOnStock"))
                           .List<Product>();

即便那样很利索,不过和LINQ to
NHibernate比较也是相当不难出错的。假使把UnitsOnStock写成了UnitSonStock,只有在运作时才会发觉到这几个错误。

除此以外,Restrictions那几个静态类还有很多概念筛选标准的便宜的章程。

三.常用功用

 

 

1.添加报表栏

将光标置于“设置报表拦”弹出“段编辑器”,再选用丰盛或删除段。

添加段的时候要注意:

1)选取添加段的岗位,如想添加子数据区,则当选要添加父数据区,点击添加“数据区”即可,如图所示:

亚洲必赢官网 19亚洲必赢官网 20亚洲必赢官网 21

2)若加上的数据区与原数据区平级,任选段,点击添加“数据区”即可,如图所示:

亚洲必赢官网 22亚洲必赢官网 23亚洲必赢官网 24

辉映记录集

当今让大家研讨怎样映射记录集。那也号称投影。使用Criteria
API未有动用LINQ方便,大家亟须首先定义想要投影的字段。然后,还要定义一个transformer,它将那几个值放入到所需的目的项目中,如上边包车型大巴代码所示:

var productsLookup = session.CreateCriteria<Product>()
                    .SetProjection(Projections.ProjectionList()
                    .Add(Projections.Property("Id"))
                    .Add(Projections.Property("Name"))
                    )
                    .SetResultTransformer(
                    new AliasToBeanResultTransformer(typeof(NameID)))
                    .List<NameID>();

在地方的代码中,大家使用SetProjection方法定义映射。我们挑选product的Id和Name属性,并将它们放入到NameID类型的目的中。类NameID定义如下:

public class NameID
{
    public int Id { get; set; }
    public string Name { get; set; }
}

大家使用AliasToBeanResultTransformer把询问结果转换为NameID对象的列表。注意目的对象的习性名称必须与投影属性的名号相配。假诺不兼容,ProjectionList有二个Add的重载方法,大家能够定义三个小名。这几个外号与指标对象的称谓相相称。

一.添加报表栏

 

将光标置于“设置报表拦”弹出“段编辑器”,再选用丰盛或删除段。

 

添加段的时候要留心:

 

     1)采取添加段的地方,如想添加子数据区,则当选要添加父数据区,点击添加“数据区”即可,如图所示:

                 
 亚洲必赢官网 25亚洲必赢官网 26亚洲必赢官网 27

       

       贰)若加上的数据区与原数据区平级,任选段(除数量区外),点击添加“数据区”即可,如图所示:

                 
 亚洲必赢官网 28亚洲必赢官网 29亚洲必赢官网 30

         

泛型方法定义

2.添加数据源

挑选菜单栏的“数据”,在下拉框中选中“选择数据源”,弹出“选用报表数量”框,里面会列出已经扩散的数据源,勾选供给的数据源,点击分明,此时界面左边“数据”列表中即呈现当前所选中的数据源,选中数据源,右键选拔“查看数据”,即可呈现当前数据源中所含有的数量:

亚洲必赢官网 31亚洲必赢官网 32亚洲必赢官网 33

亚洲必赢官网 34亚洲必赢官网 35

排序结果集

排序结果集格外简单。大家只需加上此外一个尺度,如下边包车型大巴代码所示:

var sortedProducts = session.CreateCriteria<Product>()
                    .AddOrder(Order.Asc("Name"))
                    .List<Product>();

以相反的顺序排列产品列表,只需选用Order类的Desc方法。大家还足以根据两特天性排序,只需为各样字段添加三个排序条件即可。

贰.添加数据源

 

选择菜单栏的“数据”,在下拉框中选中“选用数据源”,弹出“接纳报表数量”框,里面会列出已经传出的数据源,勾选须求的数据源,点击明确,此时界面左边“数据”列表中即浮现当前所选中的数据源,选中数据源,右键接纳“查看数据”,即可展现当前数据源中所含有的数据:

               
  亚洲必赢官网 36亚洲必赢官网 37亚洲必赢官网 38

               
 亚洲必赢官网 39亚洲必赢官网 40

 

1 public XXDataMemory BuildDataMemoryPattern<T>(XXParams zb, string id) where T : XXDataRecord, new()

叁.添加体系变量

对于某个变量恐怕取自当前系统,如时间,页码,序号等,此时甄选系统变量中相应的变量即可,如图:

亚洲必赢官网 41

分组记录集

分组在LINQ提供程序中是独立的法子,不过在criteria
API中是影子的一局部。假如大家想依据Category分组产品和计算各类类其他产品数,大家得以行使上面包车型大巴询问:

var productsGrouped = session.CreateCriteria<Product>()
                     .SetProjection(Projections.ProjectionList()
                     .Add(Projections.GroupProperty("Category"))
                     .Add(Projections.RowCount(), "Num")
                     )
                    .List();

若果非得根据用户的选用动态变化查询,criteria
API是最合适的。除了那些之外,LINQ to
NHibernate更具有可读性以及从长时间来看更有可维护性。

三.添加种类变量

对于一些变量恐怕取自当前系统,如时间,页码,序号等,此时选用系统变量中相应的变量即可,如图:

                                                             
 亚洲必赢官网 42

 

四.添加集中

对此部分报表,须求在多少尾添加合计行,此时内需手动添加合计,弹出汇总项编辑器,再在集聚项编辑器中添加汇总数据源。

亚洲必赢官网 43

在集中名称一栏可以自命名3个钻探名称;

亚洲必赢官网 44

在“数据列或公式”中得以选取集中的数据源;

在“总括段中每壹列”可以采纳参预汇总的数据区;

在“总结知足上面条件的行”中得以做过滤,在写total时会出现计量某体系型的和,比如总计总人次分在职和离休之和,此时在写total时就要求写限制标准进行过滤。如[Table1.GRXZ]==”1″;如图:

亚洲必赢官网 45

强类型的尺度查询

NHibernatet
3引进了一个新的作用便是足以应用强类型定义规则查询。为此,QueryOver<T>参预到了ISession接口中。那里,泛型参数T表示我们想询问的实体类型。

动用QueryOver API,大家钦点询问的根,如上面包车型大巴代码所示:

var query = session.QueryOver<Product>();

【亚洲必赢官网】并做为参数字传送入泛型方法中运用,条件查询。简单来讲的拿到具有产品的列表,使用如下所示的询问:

var products = session.QueryOver<Product>().List();

与Criteria API比较,QueryOver不需求内定重回类型。

肆.添加集聚

对于某些表格,必要在数码尾添加合计行,此时急需手动添加合计,弹出汇总项编辑器,再在集中项编辑器中添加汇总数据源。

                                     
  亚洲必赢官网 46

在汇聚名称1栏可以自命名三个体协会议名称;

                                       
 亚洲必赢官网 47

在“数据列或公式”中能够挑选集中的数据源;

在“计算段中每一列”能够挑选加入汇总的数据区;

在“计算满足上边条件的行”中能够做过滤,在写total时会出现计量某连串型的和,比如计算总人次分在职和退休之和,此时在写total时就要求写限制条件实行过滤。如[Table1.GRXZ]==”1″;如图:

                                                       
 亚洲必赢官网 48

调用方法代码

五.添加过滤、排序、分组

双击数据区,弹出“编辑数据段”,能够举办数据源的选项、排序、过滤。如图:

亚洲必赢官网 49

界定再次来到的记录数

限定查询重返的记录数,大家能够利用Take方法。那一个查询和LINQ to
NHibernate的询问相似,如下边所示:

var first10Products = session.QueryOver<Product>()
                      .Take(10)
                      .List();

伍.添加过滤、排序、分组

双击数据区,弹出“编辑数据段”,能够进行数据源的精选、排序、过滤。如图:

                                         
 亚洲必赢官网 50

 

 1 var obj = new GenerateDataHelper(_Param);
 2 Type myGenericClassType = obj.GetType();
 3 //MakeGenericMethod 设置泛型参数类型
 4 MethodInfo mi = myGenericClassType.GetMethod("BuildDataMemoryPattern").MakeGenericMethod(typeEntity);
 5 int count = 0;
 6 //设置调用方法参数
 7 object[] invokeArgs = new object[] { zb, id, count };
 8 //调用
 9 var dt = (DataTable)mi.Invoke(obj, invokeArgs);
10 //获取回返数据
11 recordCount = (int)invokeArgs[9];

四.常用属性

筛选记录集

筛选记录集使用Where方法。获得全数下架产品的列表,使用上边包车型大巴代码:

var discontinuedProducts = session.QueryOver<Product>()
                           .Where(p => p.Discontinued)
                           .List();

本来,大家仍可以结合八个筛选,例如,获取具有在架上且须要再度订购的产品列表,如上边包车型大巴代码所示:

var productsToReorder = session.QueryOver<Product>()
                        .Where(p => p.Discontinued == false)
                        .Where(p => p.ReorderLevel >= p.UnitsOnStock)
                        .List();

咱俩还足以选用上边包车型地铁艺术筛选:

var productsToReorder = session.QueryOver<Product>()
                        .Where(p => p.Discontinued == false &&p.ReorderLevel >= p.UnitsOnStock)
                        .List();

四.常用属性

 

一.页面装置

用来呈现总的页数(TotalPages),例如:页脚彰显第3页/共20页。系统第3次扫描报表时总括出TotalPages,然后第四回实际变化报表。如若不应用Doublepass,则TotalPages再次来到0,所以必须安装report的性质doublepass为true;

安装方式:点击报表树,单击报表树最上方图标,点击属性,选拔doublepass为true;也可平素在属性框中甄选report,举行相关属性设置!如图:

亚洲必赢官网 51亚洲必赢官网 52

排序结果集

选用QueryOver
API排序和LINQ至极相似,只是LINQ定义OrderBy和OrderByDescending来定义升序和降序,而QueryOver
API只定义了一个OrderBy方法。可是,这么些办法必须和Asc只怕Desc组合使用。当依据五个字段排序时,那七个API都有ThenBy(LINQ还有1个ThenByDescending)方法。

收获依据Name升序和Unit普赖斯降序排列的产品列表,代码如下所示:

var sortedProducts = session.QueryOver<Product>()
                    .OrderBy(p => p.Name).Asc
                    .ThenBy(p => p.UnitPrice).Desc
                    .List();

一.页面设置

用以展示总的页数(TotalPages),例如:页脚展现 第二页/共20页。系统第3遍扫描报表时总计出TotalPages,然后第二遍实际变化报表。借使不选择Double pass,则TotalPages再次回到0,所以必须设置report的特性doublepass为true;

安装方法:点击报表树,单击报表树最上方图标,点击属性,采取doublepass为true;也可径直在属性框中选拔report,举办有关属性设置!如图:

                                       
  亚洲必赢官网 53亚洲必赢官网 54

上面是整套代码,具体成效实现略过

二.打字与印刷设置

对此套打模板,样式在纸张淑节经固定了(如处方笺、收取金钱发票),只要求遵守原定的样本将数据填充进去,在绘制的时候,需求用尺子卓绝尺寸,为了能够有2个更加好的效劳,1般把页面桃月经存在不供给再打印出来的也画出来,可是供给安装属性“printable”为false:表示打字与印刷不出示,若想在预览的时候就绝不看到那几个不须求打字与印刷的,则需安装属性“Visible”为false:表示预览不出示。

黑影结果集

运用QueryOver
API定义映射也是最难的壹有的。假若只想搜寻全部成品的Id和Name,并将它们填充到NameID对象的数组中,能够采用下边包车型地铁代码实现:

var productsLookup = session.QueryOver<Product>()
                    .Select(p => p.Id, p => p.Name)
                    .TransformUsing(Transformers.AliasToBean<NameID>())
                    .List<NameID>();

瞩目大家是何等利用Select方法定义大家想投影的性格列表。每一个属性都由2个拉姆达表明式定义,例如p=>p.Name投影Name属性。然后,大家采纳TransformUsing方法证明NHibernate怎样转移投影结果。在头里的例子中大家选拔AliasToBean转换器注脚NameID作为靶子转移类型。NHibernate还定义了其他的转换器,甚至能够定义本人的转换器。静态类Transformers给出了我们可用转换器的列表。最终调用List<NameID>甘休。那里我们声化痰标项目,否则,NHibernate会认为目的项目还是是Product。

二.打印设置

对此套打模板,样式在纸张上曾经固化了(如处方笺、收取薪给发票),只需求依据原定的样本将数据填充进去,在绘制的时候,要求用尺子卓绝尺寸,为了能够有三个越来越好的功能,一般把页面辰月经存在不必要再打字与印刷出来的也画出来,不过必要安装属性“printable”为false:表示打字与印刷不突显,若想在预览的时候就绝不看到那个不须要打字与印刷的,则需安装属性“Visible”为false:表示预览不出示。

亚洲必赢官网 55亚洲必赢官网 56

三.格式设置

报表中有个别数据必要依据分明的格式去显得,如供给把日子的格式改变一下,选中当前数据,右键单击,点击format(或在属性栏中选取format),在弹出的精选格式框中选择供给的格式。若format中从未索要的格式,则必要在custom中自定义,比如小编须求把日子设置为二〇一三-0九-091一:2二:2三,此时得以在custom中填时间显示格式:yyyy-MM-ddHH:mm:ss。注意有的须要浮现中午恐怕清晨,表示早上午后的格式是tt,具体有关安装能够参考已存在的format实行编写制定!如图:

亚洲必赢官网 57亚洲必赢官网 58

分组记录集

当我们运用投影转换数据时,还足以分组记录集以及给字段应用聚合函数。依据Category分组全体的成品,然后总括各样项目下产品的个数,还足以测算每一种品种下的平分单价以及各种体系下的仓库储存量总和。如上面包车型地铁代码所示:

var productsGrouped = session.QueryOver<Product>()
                    .Select(Projections.Group<Product>(p => p.Category),
                            Projections.Avg<Product>(p => p.UnitPrice),
                            Projections.Sum<Product>(p => p.UnitsOnStock),
                            Projections.RowCount())
                    .List<object[]>();

为了简单,上面的代码中大家尚无概念转换,只是让NHibernate重临结果集的行数。

三.格式设置

报表中1些数据须求服从明确的格式去浮现,如供给把时间的格式改变一下,选中当前数码,右键单击,点击format(或在属性栏中精选format),在弹出的接纳格式框中甄选要求的格式。若format中尚无索要的格式,则要求在custom中自定义,比如小编急需把时光设置为贰零一三-0玖-0九 1一:2贰:2三,此时可以在custom中填时间呈现格式:yyyy-MM-dd HH:mm:ss。注意有的要求体现午夜要么上午,表示下午午夜的格式是tt,具体有关设置能够参照已存在的format进行编辑!如图:

                                               
  亚洲必赢官网 59亚洲必赢官网 60

              

 1 public class UtilFetchHelper 
 2 {
 3     //获取实体类型
 4     private Type getEntity(string typeName)
 5     {
 6         var workPath = AppDomain.CurrentDomain.BaseDirectory;
 7         string[] files = Directory.GetFiles(workPath, "XXX.Utils.dll", SearchOption.TopDirectoryOnly);
 8         foreach (string file in files)
 9         {
10             string ext = file.Substring(file.LastIndexOf("."));
11             if (ext != ".dll") continue;
12             try
13             {
14                 Assembly asm = Assembly.LoadFile(file);
15                 Type[] allTypes = asm.GetTypes();
16                 foreach (Type t in allTypes)
17                 {
18                     if (t.IsSubclassOf(typeof(XXDataRecord)))
19                     {
20                         if (t.Name.ToUpper().IsSame(typeName.ToUpper()))
21                             return t;
22                     }
23                 }
24             }
25             catch
26             {
27                 return null;
28             }
29         }
30         return null;
31     }
32 
33     public DataTable BuildDataMemoryPattern(XXParams zb, string id, out int recordCount)
34     {
35         //根据传入参数获取实体名称
36         var entityName = GetDataSourceEntityName(zb);
37         //获取实体类型
38         Type typeEntity = getEntity(entityName);
39         if (typeEntity == null)
40             return  null;
41         var obj = new GenerateDataHelper(_Param);
42         Type myGenericClassType = obj.GetType();
43         MethodInfo mi = myGenericClassType.GetMethod("BuildDataMemoryPattern").MakeGenericMethod(typeEntity);
44         int count = 0;
45         object[] invokeArgs = new object[] { zb, id, count };
46         var dt = (DataTable)mi.Invoke(obj, invokeArgs);
47         //这里获取回返数据
48         recordCount = (int)invokeArgs[9];
49         return dt;
50     }
51 }
52 
53 public class GenerateDataHelper
54 {
55     private List<XXDataRecord> _DataList;
56     private List<XXDataRecord> DataList
57     {
58         set { _DataList = value; }
59         get { return _DataList; }
60     }    
61     
62     private List<T> GetDataSource<T>() where T : XXDataRecord, new()
63     {
64         var _DataList = new List<T>();
65         var dt = DB.ExecuteDataTable("Select * From XX");
66         for (int i = 0; i < dt.Rows.Count; i++)
67         {
68             var dataEnt = new T();
69             for (int j = 0; j < dt.Columns.Count; j++)
70             {
71                 dataEnt[dt.Columns[j].ColumnName] = dt.Rows[i][j];
72             }
73             _DataList.Add(dataEnt);
74         }
75         return _DataList;        
76      }
77         
78         
79     public XXDataMemory BuildDataMemoryPattern<T>(XXParams zb, string id) where T : XXDataRecord, new()
80     {
81         List<T> DataList = new List<T>();
82         DataList = GetDataSource<T>();
83         //以下是具体实现代码 针对DataList查询操作
84     }
85 }

4.呈现设置

对此有些数据,名称较长,在行高固定的景况下,系统默许为自动换行,此时双方均不能够一心突显不可能一心展现,比如,此时依据客户的须求,若必要机关截断,则设置“WordWrap”为false,若需要全副体现,则供给让该数额有依据单元格大小活动缩放功效,设置属性“AutoShrink”为fontsize大概fontwith。

应用QueryOver检索数据

在那几个例子中,大家抬高1些成品到数据库,然后选择QueryOver方法检索那些制品。

还要,大家使用Loquacious配置和ConfOrm映射,就当复习前边的情节了。

ConfOrm映射在NHibernate初学者指南(6):映射模型到数据库之格局2

Loquacious配置在NHibernate初学者指南(1四):配置的二种方式

上边正式开头大家的事例。

  1. 在SSMS中创制二个数据库:QueryOverSample。

  2. 在Visual Studio中创立2个控制台应用程序:QueryOverSample。

3.
为项目增加对NHibernate.dll,NHibernate.ByteCode.Castle.dll和ConfOrm.dll程序集的引用。

  1. 在档次中添加2个类公事Category.cs,添加如下代码定义Category实体:

    public class Category
    {

     public virtual Guid Id { get; set; }
     public virtual string Name { get; set; }
     public virtual string Description { get; set; }
    

    }

  2. 在档次中添加二个类公事Product.cs,添加如下代码定义Product实体:

    public class Product
    {

     public virtual Guid Id { get; set; }
     public virtual string Name { get; set; }
     public virtual Category Category { get; set; }
     public virtual decimal UnitPrice { get; set; }
     public virtual bool Discontinued { get; set; }
     public virtual int ReorderLevel { get; set; }
     public virtual int UnitsOnStock { get; set; }
    

    }

陆.
在Program类中,添加三个静态方法使用Loquacious配置创建四个NHibernate的Configuration对象:

private static Configuration GetConfiguration()
{
    var cfg = new Configuration();
    cfg.SessionFactory()
    .Proxy
    .Through<ProxyFactoryFactory>()
    .Integrate
    .LogSqlInConsole()
    .Using<MsSql2008Dialect>()
    .Connected
    .Through<DriverConnectionProvider>()
    .By<SqlClientDriver>()
    .Using(new SqlConnectionStringBuilder
    {
        DataSource = @".",
        InitialCatalog = "QueryOverSample",
        IntegratedSecurity = true
    });
    return cfg;
}
  1. 在Program类中添加三个静态方法为实体定义映射,代码如下所示:

    private static void AddMappings(Configuration configuration)
    {

     var types = new[] { typeof(Category), typeof(Product) };
     var orm = new ObjectRelationalMapper();
     orm.TablePerClass(types);
     var mapper = new Mapper(orm);
     var hbmMappings = mapper.CompileMappingFor(types);
     configuration.AddDeserializedMapping(hbmMappings, "MyDomain");
    

    }

  2. 在Program类中添加2个静态方法成立或重复成立数据库架构,如下所示:

    private static void BuildSchema(Configuration configuration)
    {

     new SchemaExport(configuration).Execute(true, true, false);
    

    }

  3. 在Program中丰裕此外1个静态方法成立数量,如下边包车型大巴代码所示:

    private static void BuildSchema(Configuration configuration)
    {

     new SchemaExport(configuration).Execute(true, true, false);
    

    }

    private static void AddProductsAndCategories(ISessionFactory sessionFactory)
    {

     var categories = new List<Category>();
     var products = new List<Product>();
     var random = new Random((int)DateTime.Now.Ticks);
     for (var i = 1; i <= 5; i++)
     {
         var category = new Category
         {
             Name = string.Format("Category {0}", i)
         };
         categories.Add(category);
         var count = random.Next(10);
         for (var j = 1; j <= count; j++)
         {
             var product = new Product
             {
                 Name = string.Format("Product {0}", i * 10 + j),
                 Category = category,
                 UnitPrice = (decimal)random.NextDouble() * 10m,
                 Discontinued = random.Next(10) > 8,
                 UnitsOnStock = random.Next(100),
                 ReorderLevel = random.Next(20)
             };
             products.Add(product);
         }
     }
     using (var session = sessionFactory.OpenSession())
     using (var tx = session.BeginTransaction())
     {
         foreach (var category in categories)
         {
             session.Save(category);
             foreach (var product in products)
             {
                 session.Save(product);
             }
         }
         tx.Commit();
     }
    

    }

如今大家运用ISession接口的QueryOver方法创立一些数据报表。

十.
创办贰个静态方法,创造一个session和transaction,用来调用报表成立报表方法,如下所示:

private static void PrintReports(ISessionFactory sessionFactory)
{
    Console.WriteLine();
    Console.WriteLine("---------------------");
    Console.WriteLine("| Prining Reports |");
    Console.WriteLine("---------------------");
    using (var session = sessionFactory.OpenSession())
    using (var tx = session.BeginTransaction())
    {
        PrintListOfCategories(session);
        tx.Commit();
    }
}
  1. 咱俩须求贯彻PrintListOfCategories方法,代码如下:

    private static void PrintListOfCategories(ISession session)
    {

    Console.WriteLine("\r\nList of categories:\r\n");
    var categories = session.QueryOver<Category>()
    .OrderBy(c => c.Name).Asc
    .List();
    foreach (var category in categories)
    {
        Console.WriteLine("Category: {0}", category.Name);
    }
    

    }

  2. 在Program类中,创建三个静态字段,如下所示:

    private static ISessionFactory sessionFactory;

壹叁.
在Main方法中添加如下代码,创设布局,添加映射,创造或另行创造数据库架构,创造session工厂,成立和存款和储蓄category和product实体,最后调用PrintReports方法,如下所示:

var configuration = GetConfiguration();
AddMappings(configuration);
BuildSchema(configuration);
sessionFactory = configuration.BuildSessionFactory();
AddProductsAndCategories(sessionFactory);
PrintReports(sessionFactory);
Console.Write("\r\n\nHit enter to exit:");
Console.ReadLine();
  1. 运作程序,结果如下图所示:

亚洲必赢官网 61

15.
添加另一个表格方法,检索未有下架和急需重新订购的富有成品列表。产品列表应该先按category名称排序,再按product名称排序,代码如下所示:

private static void PrintProductsToReorder(ISession session)
{
    Console.WriteLine("\r\nList of products to reorder:\r\n");
    Product productAlias = null;
    Category categoryAlias = null;
    var products = session.QueryOver<Product>(() => productAlias)
    .JoinAlias(() => productAlias.Category, () => categoryAlias)
    .Where(() => productAlias.Discontinued == false)
    .Where(() => productAlias.ReorderLevel >= productAlias.UnitsOnStock)
    .OrderBy(() => categoryAlias.Name).Asc
    .ThenBy(() => productAlias.Name).Asc
    .List();
    Console.WriteLine();
    foreach (var product in products)
    {
        Console.WriteLine(
        "Category: {0}, Product: {1} (Units on stock: {2})",
        product.Category.Name, product.Name,
        product.UnitsOnStock);
    }
}
  1. 在PrintReports方法中调用PrintProductsToReorder方法。

  2. 再也运营程序,结果如下图所示:

亚洲必赢官网 62

在意,由于选择的是随机生成的数字,结果会不1致,小编初阶运转了三遍,上海体育场所中的矩形框中都从没有过结果。

四.出示设置

对于有个别数据,名称较长,在行高固定的情事下,系统私下认可为自动换行,此时双边均不能够完全展现无法完全展现,比如,此时遵守客户的急需,若须求机关截断,则设置“WordWrap”为false(即不自行换行),若供给任何出示,则供给让该多少有依照单元格大小活动缩放功用,设置属性“AutoShrink”为fontsize只怕fontwith。

View Code

5.边框设置

边框能够透过工具栏设置,此时设置边框是根据外界框的高低来呈现,上面框的装置也得以经过设置下划线,此时上面框的长短是依照数量彰显的长度来支配,还足以设置属性“underline”为true,此时也是基于边框的分寸来显示的。

总结

首先大家讲解了准星查询的两种艺术,即:非类型化的和强类型的。然后经过二个简约的事例,将理论知识得以利用,在例子中穿插着复习了前方的知识:使用Loquacious配置和ConfOrm映射。

伍.边框设置

边框能够由此工具栏设置,此时安装边框是根据外界框的分寸来展现,上边框的装置也得以经过设置下划线,此时上面框的长短是基于数量展现的长度来支配,还足以设置属性“underline”为true,此时也是依照边框的大小来呈现的。

 

六.表格设置

1)表格的行列数:通过品质设置ColumnCount和RowCount设置。

2)合并/分割单元格:选中供给统一/分割的单元格,右键单击,选取“合并单元格”/“分割单元格”,如图:

亚洲必赢官网 63

叁)插入行列:选中某行、某列,右键单击,选取须要插入的任务,如图:

亚洲必赢官网 64亚洲必赢官网 65

陆.表格设置

一)表格的种类数:通过质量设置ColumnCount(列)和RowCount(行)设置。

2)合并/分割单元格:选中要求统1/分割的单元格,右键单击,选拔“合并单元格”/“分割单元格”,如图:

                                       
       亚洲必赢官网 66

 

叁)插入行列:选中某行、某列,右键单击,选拔须要插入的地方,如图:

                                 
  亚洲必赢官网 67亚洲必赢官网 68

 

五.常用代码

五.常用代码

 

1.在文件编辑器中编辑

法斯特report软件本人带了好多功用达成数据的变换,直接在编写制定框中即可完毕。

亚洲必赢官网 69

常用的职能有:

亚洲必赢官网 70慎选语句IFF;控制语句Switch;

亚洲必赢官网 71截取字符串语句SubString,在text列表中采取SubString

亚洲必赢官网 72截取时间语句Date&Time:

亚洲必赢官网 73算数运算语句Mathematical:常用的有Abs。

只顾,在采纳那个function的时候,在文件编辑器右下角会显示当前服从的用法规则,如图:

亚洲必赢官网 74亚洲必赢官网 75

若当前数据类型不满意规则,则供给利用方面包车型大巴变换语句,将其转换来与规则相符的数据类型,才能利用那些function,否则会报错。

1.在文书编辑器中编辑

 

法斯特report软件自个儿带了广大效能落成数据的更换,直接在编写框中即可兑现。

                           
 亚洲必赢官网 76

 

常用的机能有:              

                                     
  亚洲必赢官网 77选择语句IFF;控制语句Switch;

                           
 亚洲必赢官网 78截取字符串语句SubString,在text列表中精选SubString

                               
 亚洲必赢官网 79截取时间语句Date&Time:

     
                                 
 亚洲必赢官网 80算数运算语句Mathematical:常用的有Abs(取相对值)。

 

小心,在选拔那一个function的时候,在文件编辑器右下角会呈现当前功效的用法规则,如图:

 

亚洲必赢官网 81亚洲必赢官网 82

若当前数据类型不满意规则,则要求采纳方面包车型地铁变换语句,将其转换到与规则相符的数据类型,才能利用这么些function,不然会报错。

 

2.在code区编写

稍加数据的更换在编辑器中无法间接达成,须要在code区域编写代码。写代码从前须求定义到相应的轩然大波上:选中需求写代码的多少所在的报表拦,在品质设置中式点心击,在事件中双击须要动用的风云,自动跳转到code区,且会油但是生一行代码,类似于privatevoidGroupHeader一_BeforePrint(objectsender,EventArgse)

{

}

报表中常用事件有BeforePrint,AfterPrint。

2.在code区编写

 

有个别数据的转换在编辑器中不可能间接促成,需求在code区域编写代码。写代码从前须求定义到相应的风浪上:选中必要写代码的多少所在的报表拦,在性质设置中式点心击,在事件中双击要求利用的风浪,自动跳转到code区,且会油但是生壹行代码,类似于private void GroupHeader一_BeforePrint(object sender, EventArgs e)

 

    {

 

    }

 

报表中常用事件有BeforePrint,AfterPrint。

 

三.常用代码

一)Data1.InitDataSource();//数据开始化,用于数据跑五次

二)有的需求把年月日展开分离展现,此时亟待采取时间并精选只体现时间的某有个别,比如有些DateTime2类型的参数值为二〇一一091玖,现须求将其年月日分手,分别以__年__月__日展现,要求运用fastreport提供的作用举行分离,即第11中学的方法,可是注意此种方法只好用来数据类型为datetime的数目;对于非datetime型的数目,能够写代码取位数也许拓展强制转换,以string为例:

privatevoidColumnFooter1_BeforePrint(objectsender,EventArgse)

{

stringtbrq=Report.GetColumnValue(“Table1.TBRQ”));

if(!String.IsNullOrEmpty

{

Text9.Text=tbrq.Substring+”年”+tbrq.Substring+”月”+tbrq.Substring+”日”;

}//字符串型用SubString,Substring表示从第0位初始,取出几人作为年。

三)小数位的主宰:可以用format对富有数据的小数位举行支配,但只对于数值型的多少才使得,可是对于string型的则须要用语句举行落实,如:

decimalsl=Report.GetColumnValue(“dtfee.Quantity”);

Cell51.Text=sl.ToString;//”0.00″若不填则依照默许值呈现,后边多少个零显得出来的多寡即为有稍许个小数;对于数据,有时须求供给有小数时则呈现小数,无小数时则突显整数,此时只供给将”0.00″改为”0.##”即可,##的个数也是可以自定义的,表示突显的最多的小数位。

3.常用代码

 

一)Data1.InitDataSource();//数据发轫化,用于数据跑五遍

 

二)有的供给把年月日开始展览分离显示,此时急需采纳时间并选用只体现时间的某某些,比如某些Date提姆e2类型的参数值为二〇一一091玖,现须求将其年月日分手,分别以__年__月__日展现,供给选拔fastreport提供的效益实行分离,即1中的方法,不过注意此种方法只好用来数据类型为datetime的数额;对于非datetime型的数额,能够写代码取位数也许拓展强制转换,以string为例:

 

private void ColumnFooter1_BeforePrint(object sender, EventArgs e)

 

    {

 

      string  tbrq=  ((String)Report.GetColumnValue(“Table1.TBRQ”));

 

      if (!String.IsNullOrEmpty(tbrq))

 

      {

 

        Text9.Text = tbrq.Substring(0,4) + “年” + tbrq.Substring(4,2) + “月”+tbrq.Substring(6,2)+”日”;

 

      }//字符串型用SubString,Substring(0,四)表示从第0位开端,取出二个人作为年。

 

3)小数位的决定:能够用format对持有数据的小数位进行控制,但只对于数值型的数量才有效,然则对于string型的则须求用语句进行落到实处,如:

 

decimal sl= ((Decimal)Report.GetColumnValue(“dtfee.Quantity”);

 

Cell51.Text=sl.ToString(“0.00”);// “0.00”若不填则依据暗中认可值展现,后边多少个零显得出来的数目即为有微微个小数;对于数据,有时供给需要有小数时则展现小数,无小数时则呈现整数,此时只供给将”0.00″改为”0.##”即可,##的个数也是足以自定义的,表示展现的最多的小数位。

 

相当效率汇总

独特作用汇总

 

壹.打字与印刷中贯彻空表格填满剩余的空行,达到钦点的行数。

1.打印中贯彻空表格填满剩余的空行,达到钦命的行数。

 

一.单页展现钦命行数

为了能让数据在未填满的前提下,该页也能突显钦点的行数N,须求在数据区添加子报表,且需求设置其个性最少数据行(CompleteToNRows)为N。

亚洲必赢官网 83

一.单页展现钦点行数

 

为了能让多少在未填满的前提下,该页也能显得钦点的行数N,要求在数据区(data)添加子报表(child),且要求安装其属性最少数据行(CompleteToNRows)为N。

亚洲必赢官网 84

 

 

 

 

                             

二.比照数据行数展现钦点行数

依照一的装置,预览的时候会意识该操作只会操纵首页满足条件,当数码的行数当先一页时,后边页均遵照有稍许数量展现多少行,此时需求写代码控制。

如:

privatevoidPageHeader1_AfterPrint(objectsender,EventArgse)

{if(Engine.FinalPass)

{

Child1.CompleteToNRows=Report.GetVariableValue(“TotalPages”))*20;

}//依据总页数*20来控制CompleteToNRows。

}

此刻报表拦中的child区CompleteToNRows设置为一,如图:

亚洲必赢官网 85

2.根据数据行数字展现示钦点行数

 

根据一的装置,预览的时候会发现该操作只会操纵首页满意条件,当数码的行数超越1页时,前边页均遵照有个别许数量呈现多少行,此时内需写代码控制。

 

如:

 

private void PageHeader1_AfterPrint(object sender, EventArgs e)

 

{      if (Engine.FinalPass)

 

      {

 

        Child1.CompleteToNRows = ((Int32)Report.GetVariableValue(“TotalPages”)) * 20;

 

      }//按照总页数*20来控制CompleteToNRows。

 

}

 

那时报表拦中的child区CompleteToNRows设置为壹,如图:

亚洲必赢官网 86

二.本页合计和本期合计

二.本页合计和本期合计

1.本页合计

在每页均会显得,且计算当前页相关数据的和。此时勾选“打字与印刷后重置”项,再将协商项移到对应的职责即可。如图:

亚洲必赢官网 87

一.本页合计

在每页均会显示,且总结当前页相关数据的和。此时勾选“打字与印刷后重置”项,再将协商项移到相应的岗位即可。如图:

 

 

 亚洲必赢官网 88

二.本期小计

在每页均会显得,可是指在数据的末梢一页显示合计的数据,计算当前报表的具有数据和;必要写total来总括当前值,只是本期小计中打字与印刷后重置这些天性不勾选,由于本期小计只在最终1页显示数据,其余页面上数据区均为空,要求代码控制,例如:

privatevoidColumnFooter1_BeforePrint(objectsender,EventArgse)

{

ifReport.GetVariableValue!=Report.GetVariableValue(“TotalPages”)))//设置展现本期小计需求的标准,即当前页与总页数相平等的时候,初叶显得数据,不然为空。

2.本期小计

在每页均会呈现,可是指在多少的最后一页展现合计的多少,计算当前报表的装有数据和;供给写total来测算当前值,只是本期小计中打印后重置那特个性不勾选,由于本期小计只在结尾一页突显数据,其余页面上数据区均为空,须求代码控制,例如:

private void ColumnFooter1_BeforePrint(object sender, EventArgs e)

    {

      if(((Int32)Report.GetVariableValue(“Page”))!=((Int3二)Report.GetVariableValue(“TotalPages”)))//设置呈现本期小计要求的尺度,即当前页与总页数相平等的时候,初步展现数据,不然为空。

3.交叉表的用法

参考模板收取费用员结账汇总报表.frx

只顾交叉表的队列宽度不需安装,自动根据数据长短实行设置。

三.交叉表的用法 (演示)

参考模板    收取金钱员结账汇总报表.frx

只顾交叉表的系列宽度不需安装,自动遵照数据长短举办设置。

4.套打模板

参照模板门诊挂号发票.frx,处方笺.frx

登记发票的模板

留意,在周浦品种中,由于处方笺模板不一致,在先生工作站会基于采用调用差别的模板,此时是将三种分裂的模板组合在联合署名,再依据标志调用相应的模版。

肆.套打模板(演示)

参照模板   门诊挂号发票(套打).frx,处方笺(综合).frx

登记发票的模板

注意,在周浦类型中,由于处方笺模板不雷同,在医生工作站会基于选取调用差别的模版,此时是将三种分歧的模板组合在1起,再依据标志调用相应的沙盘。

五.超链接模板

5.超链接模板(演示)

报表&单据导入

报表&单据导入

1.单据导入

单据即由开发一向传入数据源,在模块中完成单据的绘图。

步骤:找到相呼应的模块,点击打字与印刷,进入空白模板,再开展规划。对于曾经绘制好的沙盘,能够直接导入,但只顾,必须在本土把数据源清空,再导入,否则将会冒出data区重复,导致命名出现至极,如data11。

有点模板固然清空数据源导入到模板,照旧会报错,则供给再行新建1个模板,再将原模板的事物复制进去即可。

相关联的表有:select*fromCommon.ReportTemplate

壹. 单子导入

单据即由开发向来传入数据源,在模块中贯彻单据的绘图。

步骤:找到相呼应的模块,点击打字与印刷,进入空白模板,再拓展统筹。对于早已绘制好的模版,能够直接导入,但只顾,必须在本地把数据源清空,再导入,否则将会并发data区重复,导致命名出现尤其,如data1一。

稍稍模板尽管清空数据源导入到模板,如故会报错,则供给再度新建3个模板,再将原模板的事物复制进去即可。

相关联的表有:select * from Common.ReportTemplate

2.报表导入

报表即由存款和储蓄进程达成,然后再对应到相应的积存进程,去存款和储蓄进度中的数据。

步骤:报表管理à新建报表à填写相应的信息后保存à绘制模板

在意:填写音信时要绑定正确的囤积进程,同时经过前台改变相应的界面呈现效果。

丰裕数据源:接纳sql,再选用相应的贮存进度,明确即可,对于新建的沙盘,模板一栏不须求选用,若采用了则会调用从前存在的模板,同时更改的话也会潜移默化从前的沙盘。

亚洲必赢官网 89亚洲必赢官网 90

相关联的表有:

select*fromCommon.Report

select*fromCommon.ReportDataSource

select*fromCommon.ReportTemplate

select*fromCommon.ReportFolder

select*fromCommon.ReportParameter

表明:fastreport本身带有德姆o,里面很多功能都以足以供我们学习参考的。

2.报表导入

报表即由存款和储蓄进程达成,然后再对应到相应的积存进度,去存款和储蓄进度中的数据。

步骤:报表管理à新建报表à填写相应的音信后保存(演示)à绘制模板

瞩目:填写音信时要绑定正确的积存进程,同时经过前台改变相应的界面展现效果。

添加数据源:选取sql,再选择相应的贮存进程,分明即可,对于新建的沙盘,模板壹栏不须要选用,若选用了则会调用从前存在的模板,同时更改的话也会潜移默化在此以前的沙盘。

亚洲必赢官网 91亚洲必赢官网 92

相关联的表有:

select * from Common.Report 

select * from Common.ReportDataSource

select * from Common.ReportTemplate

select * from Common.ReportFolder

select * from Common.ReportParameter

 

注明:fastreport本人带有德姆o,里面很多功力都以足以供大家学习参考的。

 

 

 

                              

 

 

 

 

 

 

 

 

 

网站地图xml地图