分享一个自己写的好玩的东西,顺便散点处女分
很喜欢linq但是公司的多个服务器都是win2000系统,又要在项目上挂接一些比较独立的小的新功能,
于是写了这个好玩的东西:)
处女贴~~心情还是有点激动阿,嘿嘿
这个东西怎么描述呢,其实就是一个简单的sql命令构造器,主要有两个类,Query, Command。
为了让这个构造器动起来,还写了一个数据库结构的转化器程序,这个程序的输入是(数据库连接字符串,名称空间,引用的名称空间),
输出是一堆cs代码文件,每个文件都是一个c#类,对应数据库中的一个表,然后把这些文件编译成一个库dll。
下面的代码就是使用这个构造器查询TblImages表,并读取FilePath和ImageName列,将结果存入一个IQueryResult的对象rs:
TblImages表是转化器从数据库生成的类,对应数据库中的[tblImages]表。
C# code
public PairCollection<ContentImage> GetImages(params string[] imagename) {
PairCollection<ContentImage> images = new PairCollection<ContentImage>();
TblImages ti = new TblImages();
using (Query q = new Query(DataServiceConfig.ConnectionString)) {
q.From(ti);
q.Select(ti.FilePath.Top(imagename.Length), ti.ImageName);
q.Where(ti.ImageName.In(imagename));
IQueryResult rs = q.GetResult();
if (rs.Count > 0) {
foreach (IQueryResultRow row in rs) {
images.Add(row[ti.ImageName].StringValue, new ContentImage(row[ti.FilePath].StringValue, row[ti.ThumbnailFilePath].StringValue));
}
}
}
return images;
}
也支持一些比较复杂的查询,例如多表联查:
C# code
using(Query q = new Query(DataServiceConfig.ConnectionString)) {
TblPhotos tp = new TblPhotos();
TblAlbum ta = new TblAlbum();
q.Select(tp.FileName, tp.CreateDate, tp.UserName);
q.Select(ta.AlbumName, ta.ID);
q.From(ta, tp);
q.Where(ta.ID == tp.AlbumID & ta.UserName == "smallfz");
q.Where(ta.ID.In(223, 224, 459));
IQueryResult rs = q.GetResult();
}
它生成的命令是:
SQL code
select t2.[FileName], t2.[CreateDate], t2.[UserName], t1.[AlbumName], t1.[ID]
from [tblAlbum] t1, [tblPhotos] t2
where
((t1.[ID]=t2.[AlbumID]) and (t1.[UserName]='smallfz')) and (t1.[ID] in (223, 224, 459))
另外也支持嵌套的查询。
另一个类是Command类,它与Query差不多,只不过它是用来执行insert,update,delete这种命令的,例如Update:
C# code
using(Command cmd = new Command()) {
TblAlbum ta = new TblAlbum();
cmd.Update(ta);
cmd.Set(ta.AlbumName, "我的相册");
cmd.Set(ta.IsShareAlbum, 0);
cmd.Where(ta.ID == 223);
// cmd.Execute();
}
它实际执行的sql命令是:
SQL codeupdate [tblAlbum] set [AlbumName]='我的相册', [IsShareAlbum]=0 where [ID]=223
基本就这些了,数据表中的列都继承自一个抽象类MetaCell,这个类重载了一大堆的运算符,除了这个列定义,还有其他的列;
比如Count/Max/Min的统计列:
C# code
using(Query q = new Query()) {
TblPhotos tp = new TblPhotos();
q.Select(tp.AlbumID, tp.IsUserPhoto.Count());
q.From(tp);
q.GroupBy(tp.AlbumID);
q.OrderBy(tp.IsUserPhoto.Count(), OrderByType.DESC);
// q.GetResult();
}
SQL codeselect t1.[AlbumID], count(t1.[IsUserPhoto]) AS Count_IsUserPhoto
from [tblPhotos] t1
group by t1.[AlbumID]
order by count(t1.[IsUserPhoto]) DESC
|