LINQ&ADO
接触LINQ还不是很久,刚开始是看到TerryLee的关于LINQ的文章,后来又看了李永京前辈的文章,才开始认识LINQ,不说,进入正题。
LINQ&ADO到底是什么,其实,它只是它们2个的结合产品。
主要,LINQ在项目中跟数据库通讯时,必须要有LINQ类DBML,类里面放的都是数据库表的映射类,在数据库庞大的情况下,映射类太多。虽然有生成工具,但总觉的用起来还不是很舒服。
后来就看到LINQ TO DATASET的文章,就想把LINQ和ADO.NET结合用。
首先,把需要的数据放入一个数据池中,保存在内存中,然后用LINQ对数据进行操作。
数据池其实很简单,主要就是用ADO.NET查询所需要的数据,放入一个DATASET中保存起来。
1.查询所需要的数据

Code
public class GetDataInformation:GetDataBase
{
//连接字符串
private string conntionstring = string.Empty;
//SQL处理方法实例
private Database.SqlDatabase data = null;
public GetDataInformation(string ConntionString)
{
this.conntionstring = ConntionString;
}
//次类继承Base类,对Base类中的可重写方法进行覆盖,具体实现该方法
public override DataTable GetMyInformation()
{
//SQL语句
string strSQL = "select keycode,school_id from checkonwork200810 where brushtime between '2008-10-09 00:00:00' and '2008-10-09 23:59:59' and type='1' and cardattribute in ('2','3')";
try
{
if (strSQL != null && conntionstring != string.Empty)
{
data = new Database.SqlDatabase(conntionstring);
return data.ExecGetTable(strSQL);
}
ResultValue = 0;
ResultDescription = "查询成功";
}
catch (Exception err)
{
//设置异常后的错误代码和描述
//ResultValue =
//ResultDescription =
return null;
}
strSQL = string.Empty;
return null;
}
public override DataTable GetKeyCode()
{
//SQL语句
string strSQL = "select * from keycode where schoolid='000'";
try
{
if (strSQL != null && conntionstring != string.Empty)
{
data = new Database.SqlDatabase(conntionstring);
return data.ExecGetTable(strSQL);
}
ResultValue = 0;
ResultDescription = "查询成功";
}
catch (Exception err)
{
//设置异常后的错误代码和描述
//ResultValue =
//ResultDescription =
return null;
}
strSQL = string.Empty;
return null;
}
}
2.将查询到的数据,ADD到DATASET中

Code
//数据集合(数据池),可自行添加多个
private DataSet datapool = null;
/// <summary>
/// 设置或获取数据集合
/// </summary>
public DataSet Datapool
{
get { return datapool; }
set { datapool = value; }
}
public DataPool()
{
datapool = new DataSet();
}
public bool PushToDataPool(DataTable table, string tableName)
{
table.TableName = tableName;
try
{
Datapool.Tables.Add(table);
return true;
}
catch (Exception err)
{
}
return false;
}
操作完毕后,就可以用LINQ对DATASET进行数据操作了。
3.我开启了一个新的线程,查询数据和ADD数据

Code
public class Function
{
//错误代码变量(不允许删除)
private int resultValue = -1;
//错误描述变量(不允许删除)
private string resultDescription = "unkown";
public static DataPool datapool = new DataPool();
public static Thread PoolThread = null;
//public delegate void Mydel();
//public event Mydel myevn;
//public delegate void Method();
//public static Method method;
public void DataProcess()
{
GetDataBase getdata = GetDataFactory.getdatafactory(datapool, "getdatainformation");
try
{
if (datapool.Datapool == null)
{
datapool.Datapool = new DataSet();
}
getdata.Parameter=getdata.GetMyInformation();
if (getdata.Parameter == null)
{
//resultValue=
//resultDescription=
datapool.Datapool = null;
return;
}
else
{
datapool.PushToDataPool((DataTable)getdata.Parameter, "checkonwork200810");
}
getdata.Parameter = getdata.GetKeyCode();
if (getdata.Parameter == null)
{
//resultValue=
//resultDescription=
datapool.Datapool = null;
return;
}
else
{
datapool.PushToDataPool((DataTable)getdata.Parameter, "keycode");
}
//this.myevn += new Mydel(Function_myevn);
//myevn();
}
catch (Exception err)
{
//错误代码
//resultValue=
//错误描述
//resultDescription
}
finally
{
PoolThread.Abort();
PoolThread = null;
}
}
//public void Function_myevn()
//{
// method.Invoke();
//}
public void startthread()
{
PoolThread = new Thread(new ThreadStart(this.DataProcess));
PoolThread.Start();
}
}
4.下面是我用LINQ对DATASET的操作
2表的连接

Code
if (DataBufferPool.Function.datapool.Datapool == null)
{
return;
}
var a = from b in DataBufferPool.Function.datapool.Datapool.Tables["keycode"].AsEnumerable()
where b.Field<string>("schoolid") == "000"
select b;
var c = from d in DataBufferPool.Function.datapool.Datapool.Tables["checkonwork200810"].AsEnumerable()
join m in a
on d.Field<string>("keycode") equals m.Field<string>("keyvalue")
select new
{
school = d.Field<string>("school_id"),
keycode = d.Field<string>("keycode"),
keyname = m.Field<string>("keyname")
};
dataGridView1.DataSource = c.ToArray();
2表的统计数据

Code
if (DataBufferPool.Function.datapool.Datapool == null)
{
return;
}
var a = from b in DataBufferPool.Function.datapool.Datapool.Tables["checkonwork200810"].AsEnumerable()
group b by b.Field<string>("keycode") into c
orderby c.Key
select new
{
keycode = c.Key,
num = (from d in DataBufferPool.Function.datapool.Datapool.Tables["checkonwork200810"].AsEnumerable()
where d.Field<string>("keycode") == c.Key
select d).Count<DataRow>()
};
dataGridView1.DataSource = a.ToArray();
对我来说比较复杂的一个查询吧

Code
if (DataBufferPool.Function.datapool.Datapool == null)
{
return;
}
var a = from b in DataBufferPool.Function.datapool.Datapool.Tables["checkonwork200810"].AsEnumerable()
group b by b.Field<string>("keycode") into c
orderby c.Key
select new
{
keycode = c.Key,
num = (from d in DataBufferPool.Function.datapool.Datapool.Tables["checkonwork200810"].AsEnumerable()
where d.Field<string>("keycode") == c.Key
select d).Count<DataRow>()
};
var v = from m in DataBufferPool.Function.datapool.Datapool.Tables["keycode"].AsEnumerable()
join n in a
on m.Field<string>("keyvalue") equals n.keycode into k
from s in k.DefaultIfEmpty()
select new
{
keyname = m.Field<string>("keyname"),
num = (s == null ? "0" : s.num.ToString())
};
dataGridView1.DataSource = v.ToArray();
下面是自己做的一个DEMO
第一次写技术的文章,也许我做的这些,都是无用功,但是,还是不太习惯用映射表,可能被ADO的思想麻痹了吧.
在此,谢谢TerryLee的文章让我认识了LINQ,也谢谢李永京前辈对我MSN的问题的解答。
LINQ&ADO到底是什么,其实,它只是它们2个的结合产品。
主要,LINQ在项目中跟数据库通讯时,必须要有LINQ类DBML,类里面放的都是数据库表的映射类,在数据库庞大的情况下,映射类太多。虽然有生成工具,但总觉的用起来还不是很舒服。
后来就看到LINQ TO DATASET的文章,就想把LINQ和ADO.NET结合用。
首先,把需要的数据放入一个数据池中,保存在内存中,然后用LINQ对数据进行操作。
数据池其实很简单,主要就是用ADO.NET查询所需要的数据,放入一个DATASET中保存起来。
1.查询所需要的数据
public class GetDataInformation:GetDataBase
{
//连接字符串
private string conntionstring = string.Empty;
//SQL处理方法实例
private Database.SqlDatabase data = null;
public GetDataInformation(string ConntionString)
{
this.conntionstring = ConntionString;
}
//次类继承Base类,对Base类中的可重写方法进行覆盖,具体实现该方法
public override DataTable GetMyInformation()
{
//SQL语句
string strSQL = "select keycode,school_id from checkonwork200810 where brushtime between '2008-10-09 00:00:00' and '2008-10-09 23:59:59' and type='1' and cardattribute in ('2','3')";
try
{
if (strSQL != null && conntionstring != string.Empty)
{
data = new Database.SqlDatabase(conntionstring);
return data.ExecGetTable(strSQL);
}
ResultValue = 0;
ResultDescription = "查询成功";
}
catch (Exception err)
{
//设置异常后的错误代码和描述
//ResultValue =
//ResultDescription =
return null;
}
strSQL = string.Empty;
return null;
}
public override DataTable GetKeyCode()
{
//SQL语句
string strSQL = "select * from keycode where schoolid='000'";
try
{
if (strSQL != null && conntionstring != string.Empty)
{
data = new Database.SqlDatabase(conntionstring);
return data.ExecGetTable(strSQL);
}
ResultValue = 0;
ResultDescription = "查询成功";
}
catch (Exception err)
{
//设置异常后的错误代码和描述
//ResultValue =
//ResultDescription =
return null;
}
strSQL = string.Empty;
return null;
}
}
2.将查询到的数据,ADD到DATASET中
//数据集合(数据池),可自行添加多个
private DataSet datapool = null;
/// <summary>
/// 设置或获取数据集合
/// </summary>
public DataSet Datapool
{
get { return datapool; }
set { datapool = value; }
}
public DataPool()
{
datapool = new DataSet();
}
public bool PushToDataPool(DataTable table, string tableName)
{
table.TableName = tableName;
try
{
Datapool.Tables.Add(table);
return true;
}
catch (Exception err)
{
}
return false;
}
操作完毕后,就可以用LINQ对DATASET进行数据操作了。
3.我开启了一个新的线程,查询数据和ADD数据
public class Function
{
//错误代码变量(不允许删除)
private int resultValue = -1;
//错误描述变量(不允许删除)
private string resultDescription = "unkown";
public static DataPool datapool = new DataPool();
public static Thread PoolThread = null;
//public delegate void Mydel();
//public event Mydel myevn;
//public delegate void Method();
//public static Method method;
public void DataProcess()
{
GetDataBase getdata = GetDataFactory.getdatafactory(datapool, "getdatainformation");
try
{
if (datapool.Datapool == null)
{
datapool.Datapool = new DataSet();
}
getdata.Parameter=getdata.GetMyInformation();
if (getdata.Parameter == null)
{
//resultValue=
//resultDescription=
datapool.Datapool = null;
return;
}
else
{
datapool.PushToDataPool((DataTable)getdata.Parameter, "checkonwork200810");
}
getdata.Parameter = getdata.GetKeyCode();
if (getdata.Parameter == null)
{
//resultValue=
//resultDescription=
datapool.Datapool = null;
return;
}
else
{
datapool.PushToDataPool((DataTable)getdata.Parameter, "keycode");
}
//this.myevn += new Mydel(Function_myevn);
//myevn();
}
catch (Exception err)
{
//错误代码
//resultValue=
//错误描述
//resultDescription
}
finally
{
PoolThread.Abort();
PoolThread = null;
}
}
//public void Function_myevn()
//{
// method.Invoke();
//}
public void startthread()
{
PoolThread = new Thread(new ThreadStart(this.DataProcess));
PoolThread.Start();
}
}
4.下面是我用LINQ对DATASET的操作
2表的连接
if (DataBufferPool.Function.datapool.Datapool == null)
{
return;
}
var a = from b in DataBufferPool.Function.datapool.Datapool.Tables["keycode"].AsEnumerable()
where b.Field<string>("schoolid") == "000"
select b;
var c = from d in DataBufferPool.Function.datapool.Datapool.Tables["checkonwork200810"].AsEnumerable()
join m in a
on d.Field<string>("keycode") equals m.Field<string>("keyvalue")
select new
{
school = d.Field<string>("school_id"),
keycode = d.Field<string>("keycode"),
keyname = m.Field<string>("keyname")
};
dataGridView1.DataSource = c.ToArray();
if (DataBufferPool.Function.datapool.Datapool == null)
{
return;
}
var a = from b in DataBufferPool.Function.datapool.Datapool.Tables["checkonwork200810"].AsEnumerable()
group b by b.Field<string>("keycode") into c
orderby c.Key
select new
{
keycode = c.Key,
num = (from d in DataBufferPool.Function.datapool.Datapool.Tables["checkonwork200810"].AsEnumerable()
where d.Field<string>("keycode") == c.Key
select d).Count<DataRow>()
};
dataGridView1.DataSource = a.ToArray();
对我来说比较复杂的一个查询吧
if (DataBufferPool.Function.datapool.Datapool == null)
{
return;
}
var a = from b in DataBufferPool.Function.datapool.Datapool.Tables["checkonwork200810"].AsEnumerable()
group b by b.Field<string>("keycode") into c
orderby c.Key
select new
{
keycode = c.Key,
num = (from d in DataBufferPool.Function.datapool.Datapool.Tables["checkonwork200810"].AsEnumerable()
where d.Field<string>("keycode") == c.Key
select d).Count<DataRow>()
};
var v = from m in DataBufferPool.Function.datapool.Datapool.Tables["keycode"].AsEnumerable()
join n in a
on m.Field<string>("keyvalue") equals n.keycode into k
from s in k.DefaultIfEmpty()
select new
{
keyname = m.Field<string>("keyname"),
num = (s == null ? "0" : s.num.ToString())
};
dataGridView1.DataSource = v.ToArray();
下面是自己做的一个DEMO
第一次写技术的文章,也许我做的这些,都是无用功,但是,还是不太习惯用映射表,可能被ADO的思想麻痹了吧.
在此,谢谢TerryLee的文章让我认识了LINQ,也谢谢李永京前辈对我MSN的问题的解答。