通过重构让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);

 

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();

 

posted on 2008-09-08 18:05  RIVERSPIRIT  阅读(1340)  评论(5)    收藏  举报