体检套餐管理系统

LINQ:进阶,linq进阶

一、Drbd 工作原理
DRBD是一种块设备,可以被用于高可用(HA)之中.它类似于一个网络RAID-1功能.(可以比较一下Linux的NFS)当你将数据写入本地
文件系统时,数据还将会被发送到网络中另一台主机上.以相同的形式记录在一个文件系统中。
本地(主节点)与远程主机(备节点)的数据可以保证实时同步.当本地系统出现故障时,远程主机上还会
保留有一份相同的数据,可以继续使用.在高可用(HA)中使用DRBD功能,可以代替使用一个共享盘阵.因为数据同时存在于本地主机和远程主机上,切换时,远程主机只要使用它上面的那份备份数据,就可以继续进行服务了。

体检套餐管理系统,套餐管理系统

今天,我们来写一个体检套餐管理系统的小项目

项目需求:

    1.加载默认体检套餐,如下图所示

    图片 1

    2.显示指定套餐的项目明细

    3.向指定套餐添加检查项目信息

    4.删除套餐中的项目信息

    5.新建套餐

开始:

首先要做的就是搭好窗体

然后创建CheckItems类

public class CheckItems
{
public string description { get; set; }
public string name { get; set; }
public int price { get; set; }
public static List<CheckItems> list = new
List<CheckItems>();
public static Dictionary<string, List<CheckItems>> dic = new
Dictionary<string, List<CheckItems>>();

}

类中包含两个集合

list存储体检项目

dic存储体检套餐

然后添加一些常见的体检项目和一个基本套餐

CheckItems c1 = new CheckItems();
c1.name = “身高”;
c1.price = 5;
c1.description = “用来检查身高”;
CheckItems c2 = new CheckItems();
c2.name = “体重”;
c2.price = 5;
c2.description = “用来检查体重”;
CheckItems c3 = new CheckItems();
c3.name = “肝功能”;
c3.price = 50;
c3.description = “用来检查肝功能”;
CheckItems c4 = new CheckItems();
c4.name = “视力”;
c4.price = 10;
c4.description = “用来检查视力”;
CheckItems c5 = new CheckItems();
c5.name = “听力”;
c5.price = 10;
c5.description = “用来检查听力”;
CheckItems c6 = new CheckItems();
c6.name = “B超”;
c6.price = 30;
c6.description = “用来检查B超”;
CheckItems c7 = new CheckItems();
c7.name = “心电图”;
c7.price = 50;
c7.description = “用来检查心电图”;
CheckItems c8 = new CheckItems();
c8.name = “血压”;
c8.price = 20;
c8.description = “用来检查血压”;
CheckItems c9 = new CheckItems();
c9.name = “血常规”;
c9.price = 20;
c9.description = “用来检查血常规”;

CheckItems.list.Add(c1);
CheckItems.list.Add(c2);
CheckItems.list.Add(c3);
CheckItems.list.Add(c4);
CheckItems.list.Add(c5);
CheckItems.list.Add(c6);
CheckItems.list.Add(c7);
CheckItems.list.Add(c8);
CheckItems.list.Add(c9);

for (int i = 0; i < CheckItems.list.Count; i++)
{
comboBox2.Items.Add(CheckItems.list[i].name);
}

List<CheckItems> li = new List<CheckItems>();
li.Add(c1);
li.Add(c2);
li.Add(c3);
CheckItems.dic.Add(“入学体检”, li);

图片 2

 

 点击添加可以添加一个体检套餐的集合

List<CheckItems> li = new List<CheckItems>();
string name = textBox1.Text;
CheckItems.dic.Add(name, li);
comboBox1.Items.Add(textBox1.Text);
MessageBox.Show(“添加成功!”);

图片 3

点击体检套餐维护下的添加可以为comboBox名字的套餐内添加检查项目,并且会自动加载价格

string name = comboBox1.Text;
List<CheckItems> li = CheckItems.dic[name];

foreach (CheckItems c in CheckItems.list)
{
if (c.name == comboBox2.Text)
{
li.Add(c);
sum += c.price;
MessageBox.Show(“添加成功!”);
break;
}
}

label7.Text = sum.ToString();
this.dataGridView1.DataSource = new
BindingList<CheckItems>(CheckItems.dic[comboBox1.Text]);

 删除也是一样的,可以删除套餐内所选定的体检项目

string name = comboBox1.Text;
List<CheckItems> li = CheckItems.dic[name];
string str = “”;
foreach (CheckItems c in CheckItems.list)
{
str =
dataGridView1.SelectedRows[0].Cells[“Column1”].Value.ToString();
if (c.name ==str )
{
li.Remove(c);
sum -= c.price;
MessageBox.Show(“删除成功!”);
break;
}
}

label7.Text = sum.ToString();
this.dataGridView1.DataSource = new
BindingList<CheckItems>(CheckItems.dic[comboBox1.Text]);

 最后一步就是动态加载dataGrideView

其实很简单,只要把事件写在comboBox的comboBox1_SelectedIndexChanged事件下就可以了

图片 4label5.Text
= comboBox1.Text;

List<CheckItems> li = new List<CheckItems>();
li = CheckItems.dic[comboBox1.Text];
foreach (CheckItems c in li)
{
sum += c.price;
}
label7.Text = sum.ToString();this.dataGridView1.DataSource = new
BindingList<CheckItems>(CheckItems.dic[comboBox1.Text]);

这样,一个简单的体检套餐小项目就OVER了

 

今天,我们来写一个体检套餐管理系统的小项目 项目需求:
1.加载默认体检套餐,如下图所示 2.显示指…

LINQ 标准查询操作概述     

筛选、投影、聚合、排序等功能在内的查询功能。  
     各个标准查询运算符在执行时间上有所不同,具体情况取决于它们是返回单一值还是值序列。返回单一值的方法(例如 Average 和 Sum)会立即执行。返回序列的方法会延迟查询执行,并返回一个可枚举的对象。
 
     对于在内存中集合上运行的方法(即扩展 IEnumerable<T> 的方法),返回的可枚举对象将捕获传递到方法的参数。在枚举该对象时,将使用查询运算符的逻辑,并返回查询结果。
 
     与之相反,扩展 IQueryable<T> 的方法不会实现任何查询行为,但会生成一个表示要执行的查询的表达式树。查询处理由源 IQueryable<T> 对象处理。
 

二、环境配置:
1、操作系统:radhat 5.4
2、主服务器:
主机名:master
IP:192.168.2.124
镜像的硬盘:/dev/hdb
3、  备份服务器
主机名:slave
IP:192.168.2.125
镜像的硬盘:/dev/hdb

一、按标准执行方式分类

     标准查询运算符方法的 LINQ to Objects
实现采用两种主要方式之一来执行:立即执行和延迟执行。采用延迟执行的查询运算符可以进一步分为两类:流式和非流式。
           1.执行方式           (1)立即:
立即执行意味着在代码中声明查询的位置读取数据源并执行运算。  返回单个不可枚举的结果的所有标准查询运算符都立即执行。
          (2)延迟:
延迟执行意味着不在代码中声明查询的位置执行运算。  仅当对查询变量进行枚举操作时才执行运算,例如通过使用 foreach 语句。这意味着查询的执行结果取决于执行查询而非定义查询时的数据源内容。如果多次枚举查询变量,则每次结果可能都不同。几乎所有返回类型为 IEnumerable<T> 或 IOrderedEnumerable<TElement> 的标准查询运算符都以延迟方式执行。 
           采用延迟执行方式的查询运算符可以另外分类为流式和非流式。    
     
①流式运算符不需要在生成元素前读取所有源数据。在执行时,流式运算符一边读取每个源元素,一边对该源元素执行运算,并在可行时生成元素。流式运算符将持续读取源元素直到可以生成结果元素。这意味着可能要读取多个源元素才能生成一个结果元素。
         
②非流式运算符必须读取所有源数据才能生成结果元素。诸如排序和分组等运算属于此类别。在执行时,非流式查询运算符读取所有源数据,将其放入数据结构中,执行运算,然后生成结果元素。
 

三、安装drbd
1、下载源代码:
2、把下载好的drbd-8.3.5.tar.gz解压
[root@master ] # tar –zxvf drbd-8.3.5.tar.gz
[root@master ] # cd drbd-8.3.5
[root@master ] # make
[root@master ] #  make install
[root@master ]# modprobe drbd            @加载安装drbd模块
[root@master ]# lsmod |grep drbd     
drbd        271736  0
@通过lsmod检查是否已经成功,如果有类似内容输出,则表示drbd安装成功了
[root@master ]# mknod /dev/drbd0 b 147 0    @创建硬件设备drbd

二、排列数据

     排序操作按一个或多个特性对序列的元素进行排序。第一个排序条件对元素执行主要排序。通过指定第二个排序条件,可以对各个主要排序组中的元素进行排序。 
     下图演示对一个字符序列执行按字母排序操作的结果。   

标准查询运算符操作方法 – 排序

方法名

说明

C# 查询表达式语法

OrderBy

按升序对值进行排序。

orderby

OrderByDescending

按降序对值进行排序。

orderby … descending

ThenBy

按升序执行次要排序。

orderby …, …

ThenByDescending

按降序执行次要排序。

orderby …, … descending

Reverse

颠倒集合中的元素的顺序。

X

  

  示例:

图片 51 var
words = new[] { “the”, “quick”, “brown”, “fox”, “jumps” }; 2 var query
= from word in words 3 orderby word.Length 4 select word; 5 6 foreach
(var word in query) 7 { 8 Console.WriteLine(word); 9 } 下面通过演示使用 orderby
进行升序排序:按字符串长度

 图片 6

 

图片 71 var
words = new[] { “the”, “quick”, “brown”, “fox”, “jumps” }; 2 var query
= from word in words 3 orderby word.Substring(0,1) descending 4 select
word; 5 6 foreach (var word in query) 7 { 8 Console.WriteLine(word); 9 }
下面通过演示使用 orderby descending
进行降序排序:按字符串的第一个字母

图片 8

 

图片 91 var
words = new[] { “the”, “quick”, “brown”, “fox”, “jumps” }; 2 var query
= from word in words 3 orderby word.Length, word.Substring(0, 1) 4
select word; 5 6 foreach (var word in query) 7 { 8
Console.WriteLine(word); 9 } 下面通过演示使用 orderby
进行主要和次要排序:先升序按字符串长度(主)、再升序按字符串的第一个字母(次)

图片 10

 

图片 111 var
words = new[] { “the”, “quick”, “brown”, “fox”, “jumps” }; 2 var query
= from word in words 3 orderby word.Length, word.Substring(0, 1)
descending 4 select word; 5 6 foreach (var word in query) 7 { 8
Console.WriteLine(word); 9 } 下面通过演示使用 orderby descending
进行主要和次要排序:先升序按字符串长度(主)、再降序按字符串的第一个字母(次)

 图片 12

 

四、配置drbd
DRBD运行时,会读取一个配置文件/etc/drbd.conf.这个文件里描述了DRBD设备与硬盘分区的映射关系,数据一旦写入磁盘并发送到网络中就认为完成了写入操作。
1、drbd.conf的配置参数说明
Protocol
Protocol  A        @数据一旦写入磁盘并发送到网络中就认为完成了写入操作
Protocol  B        @收到接收确认就认为完成了写入操作。
Protocol  C        @收到写入确认就认为完成了写入操作。
2、global
global { usage-count yes; }        @是否参加DRBD使用者统计,默认是yes
3、common
common { syncer { rate 1M; } }
@设置主备节点同步时的网络速率最大值,单位是字节.
4、resource
一个DRBD设备(即:/dev/drbdX),叫做一个”资源”。里面包含一个DRBD设备的主备节点的的ip信息,底层存储设备名称,设备大小,meta信息存放方式,drbd对外提供的设备名等等。
resource r0 {
protocol C;       
@使用协议C.表示收到远程主机的写入确认后,则认为写入完成.
net {
    cram-hmac-alg sha1;            @设置主备机之间通信使用的信息算法.
    shared-secret “FooFunFactory”;
  }
@每个主机的说明以”on”开头,后面是主机名.在后面的{}中为这个主机的配置.
on master {
    device    /dev/drbd0;
    disk      /dev/ hdb;
    address  192.168.2.124:7898;   
@设置DRBD的监听端口,用于与另一台主机通信
    meta-disk  internal;
  }
on slave{
    device    /dev/drbd0;
    disk      /dev/ hdb;
    address  192.168.2.124:7898;
    meta-disk  internal;
    }
}
5、以下为测试时的完整配置
global {
  usage-count yes;
}
common {
  protocol C;
}
resource r0 {
  on master {
    device    /dev/drbd0;
    disk      /dev/hdb;
    address  192.168.2.124:7789;
    meta-disk  internal;
  }
  on slave {
    device    /dev/drbd0;
    disk      /dev/hdb;
    address  192.168.2.125:7789;
    meta-disk internal;
  }
}

三、Set 操作

  LINQ 中的 Set
操作是指根据相同或不同集合中是否存在等效元素来生成结果集的查询操作。

 

标准查询运算符操作方法 – Set
方法名 说明

C# 查询表达式语法

Distinct

从集合移除重复值。

X

Except

返回差集,差集是指位于一个集合但不位于另一个集合的元素。

X

Intersect

返回交集,交集是指同时出现在两个集合中的元素。

X

Union

返回并集,并集是指位于两个集合中任一集合的唯一的元素。

X

 

  图解 Set 操作

  (1)Distinct: 返回的序列包含输入序列的唯一元素。

图片 13

  (2)Except:
返回的序列只包含位于第一个输入序列但不位于第二个输入序列的元素。  

图片 14

  (3)Intersect: 返回的序列包含两个输入序列共有的元素。  

图片 15

  (4)Union: 返回的序列包含两个输入序列的唯一的元素。 
图片 16

图片 17

 

6、双机两个节点的配置文件是一模一样的。DRBD源码目录下有个样本,里面说得比较详细。

 四、过滤数据

   
 筛选指将结果集限制为只包含某些满足指定条件的元素的操作。它又称为选择。
     下图演示了对字符序列进行筛选的结果。筛选操作的谓词指定字符必须为“A”。
图片 18

 

标准查询运算符操作方法 – 筛选
方法名 说明 C# 查询表达式语法
OfType 根据值强制转换为指定类型的能力选择值。 X
Where 选择基于谓词函数的值。 where

     示例: 使用 where 子句来从数组中筛选那些具有特定长度的字符串

图片 19

 

相关阅读

五、量词操作 

  限定符运算返回一个 Boolean 值,该值指示序列中是否有一些元素满足条件或是否所有元素都满足条件。

     下图描述了两个不同源序列上的两个不同限定符运算。第一个运算询问是否有一个或多个元素为字符“A”,结果为 true。第二个运算询问是否所有元素都为字符“A”,结果为 true
  图片 20  

标准查询运算符操作方法 – 量词

方法名

说明

C# 查询表达式语法

All

确定是否序列中的所有元素都满足条件。

X
Any

确定序列中是否有元素满足条件。

X

Contains

确定序列是否包含指定的元素。

X

Linux 高可用(HA)集群之DRBD详解
http://www.linuxidc.com/Linux/2013-08/89035.htm

发表评论