最近学到一些linq和面向对象的经验分享
最近学到一些linq和面向对象的经验分享给大家:
1,如果界面上有数据和集合了,而这些数据实时性很强的话,可以使用linq 或者泛行对内存里面的数据进行处理。可以减少对数据库的查询压力。匿名类型很好用。可以让你不用创建很多的对象。
1,如果界面上有数据和集合了,而这些数据实时性很强的话,可以使用linq 或者泛行对内存里面的数据进行处理。可以减少对数据库的查询压力。匿名类型很好用。可以让你不用创建很多的对象。
sql里面能做的事情,大多数linq 也能做到。
比如:
var 申请单列表= (from 别名 in 申请单集合
group 别名 by new
{
科室名称 = 别名.科室名称,
临床科室 =别名.临床科室,
药品编码= 别名. 药品编码,
药品名称 = 别名. 药品名称 ,
规格= 别名. 规格 ,
} into g
select new
{
g.Key. 科室名称 ,
g.Key.临床科室,
g.Key. 药品编码,
g.Key.TRADE_NAME,
g.Key.规格,
app_num = g.Sum(p => p.申请数量* p.每日用量)
}).ToList();
2,我们系统查询的集合好多是ArrayList数组 ,可以通过如下语句转换:
List<实体> 实体集合= new List<实体集合>(数组集合.ToArray().Cast<实体集合>()).Where(p => p.实体属性.Length > 1).ToList<实体>(); 转换转换方便查询。
3,属性数据量大的地方,尽量加上进度条,不要假死。
4,个性化需求尽量做成开关,可自动配置。下面只列一种添加参数的代码:
//是否只能药房人员(药师、药剂师)审核
private bool isPharmaceutistOnly = true;
/// <summary>
/// 是否只能药师、药剂师审核
/// </summary>
[Description( "是否只能药师、药剂师审核"),Category("设置"),DefaultValue(true)]
public bool IsPharmaceutistOnly
{
get
{
return isPharmaceutistOnly;
}
set
{
isPharmaceutistOnly = value;
}
}
后面的设置现场写过代码都都知道怎么配了。就不多说了。
5,重点分享一下:如果一个接口被很多个类实现了。突然有一天有一个类需要有一个特殊功能。怎么办呢?如果在这个接口里面添加一个方法,会出现要把所有实现此接口的的类做一个空的实现,改动比较大。
建议新建一个接口,只让需要这个功能的类实现这个接口。那么加上以前的接口。这个类就实现了多个接口了。同时又不需要改到其他的类。
6,第5点实现了接口如何调用呢。
有两种方法,1,通过类的实例化调用。
2,通过反射机制调用。
这里需要注意的是:“接口不可以实例化,但是可以通过一个类来实现接口,如果一个类被实例化了,不管他是通过什么方式实例化的(包括反射),那么他就具备了此类所具备的所有功能特性”。理解了这句话,在调用的时候就可以巧妙的应用:
如:
A,B,C,D是类, IA,IB,IC,ID 是接口;
A继承IA;B继承IB,IA;C继承IC,ID,D继承IC
突然A要添加一个功能。我添加一个IE接口,让A继承IA,IE。
因为IA的功能很早以前就可以实现的。那么如果要直接调用IE的接口方法。
可以通过如下方式调用:
1,假设以前实例化得A赋值给了G
2,可以通过G的类型转换成IE,这样就可以访问IE的方法了。如:
接口IA= G类 as 接口IA;
接口IE= G类 as 接口IE;
接口IE.方法();
3,如果你试图重新实例化IE接口,可能会导致类G被初始化掉。这里要小心。