通过重构让Linq支持Access
背景
自从接解了Linq后,深深被它吸引,但它也有一个致命的缺点,不支持Access,伤心呀,这年头还有Access???没办法呀,俺是做网站的,SQL空间贵呀。从技术上来讲,无SQL2005、SQL2000的语法都比Access要复杂得多,竟然不支Access,气愤!!!听网友介绍,说LinqToSql可以支持Access,用了一下,很不好用。毛主泽教导我们,“自己动手,丰衣足食啦”。无奈,只好自个动手啦,忙乎了大半个月了,也总搞出点眉目了。
简介
上传的“解决方案”包括三个项目,Demo、LinqToAccessDB、ReflectLinq。
1、Demo就不说了,例子也。
2、LinqToAccessDB主要包括一个实现IProvider的类,以支持Access数据库的查询。
主要实现的功能有:
a) 增删改查,允许含有自动编号字段,在插后能够自动获新值,并自动更新实体。也就是说允许把字段设为“Auto-Sync“。
b) 允许Max、Min、Sum、Avg、Count查询。
c) 不支持Take。
3、ReflacLinq是一个从System.Data.Linq“反射”出来的项目,里面的各个类与“System.Data.Linq”命名空间里的类相对应。
点击这里下载源代码
如何使用?
使用的方法和原来的一样。
1、查询:
//联接查询
var posts = (from post in db.Posts
join board1 in db.Boards on post.BoardID equals board1.ID
select new { post.Title, post.Content, BoardName = board1.Name }).Take(5);
foreach (var item in posts)
{
Console.WriteLine("{0} {1} {2}", item.BoardName, item.Title, item.Content);
}
Console.WriteLine();
//单值查询
var max = (from post1 in db.Posts
select post1.ID).Max();
Console.WriteLine("Max = {0}\r\n", max);
var min = (from post2 in db.Posts
select post2.ID).Min();
Console.WriteLine("MIN = {0}\r\n", min);
var count = (from post3 in db.Posts
select post3.ID).Count();
Console.WriteLine("COUNT = {0}\r\n", count);
int sum = (from post4 in db.Posts
select post4.ID).Sum();
Console.WriteLine("SUM = {0}\r\n", sum);
double avg = (from post5 in db.Posts
select post5.ID).Average();
Console.WriteLine("AVG = {0}\r\n", avg);
//子查询
max = (from post6 in db.Posts
where post6.ID > 0
orderby post6.ID
select post6.ID).Take(5).Max();
Console.WriteLine("Max = {0}\r\n", max);
var posts = (from post in db.Posts
join board1 in db.Boards on post.BoardID equals board1.ID
select new { post.Title, post.Content, BoardName = board1.Name }).Take(5);
foreach (var item in posts)
{
Console.WriteLine("{0} {1} {2}", item.BoardName, item.Title, item.Content);
}
Console.WriteLine();
//单值查询
var max = (from post1 in db.Posts
select post1.ID).Max();
Console.WriteLine("Max = {0}\r\n", max);
var min = (from post2 in db.Posts
select post2.ID).Min();
Console.WriteLine("MIN = {0}\r\n", min);
var count = (from post3 in db.Posts
select post3.ID).Count();
Console.WriteLine("COUNT = {0}\r\n", count);
int sum = (from post4 in db.Posts
select post4.ID).Sum();
Console.WriteLine("SUM = {0}\r\n", sum);
double avg = (from post5 in db.Posts
select post5.ID).Average();
Console.WriteLine("AVG = {0}\r\n", avg);
//子查询
max = (from post6 in db.Posts
where post6.ID > 0
orderby post6.ID
select post6.ID).Take(5).Max();
Console.WriteLine("Max = {0}\r\n", max);
2、插入

//单值插入
var user = new User()
{
Name = "User"
};
db.Users.InsertOnSubmit(user);
db.SubmitChanges();
//嵌套值入。
var root = new Board()
{
Name = "第一层",
};
root.Children.AddRange(new[] { new Board { Name = "第二层A" } ,
new Board { Name = "第二层B" } ,
new Board { Name = "第二层C"}});
root.Children[0].Children.Add(new Board { Name = "第三层A" });
db.Boards.InsertOnSubmit(root);
db.SubmitChanges();
3、更新

//更新
foreach (var post in db.Posts)
{
post.Title = "hello" + DateTime.Now;
}
db.SubmitChanges();