博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

HYORM使用篇之获取数据

Posted on 2007-06-11 20:12  hjtcyxf  阅读(93)  评论(0)    收藏  举报

使用篇之获取数据

我们想要从数据库中获取或更新数据,无非是使用select、insert、update和delete语句就可以了,而使用orm同数据库交互,当然也要有这些方面的支持。今天我就说一下HYORM是怎样支持select的。

1.        通过主键得到某行记录

在我们的日常对数据库的操作中,通过主键来获取某行记录可能是最常用的,下面就是HYORM的具体做法了:

//首先,我们必须声明一个工作单元,这是进行每个操作第一不必须做的事情。工作单元是整个ORM的核心所在

 AbstractWorkUnit unit = new WorkUnit(XmlConfig.Instance());

//通过工作单元的Load方法根据主键7来加载一个实体

 PublishersEntity publisher = unit.Load(typeof(PublishersEntity), 7) as PublishersEntity;

 

好,就这样,你就可以获取一个实体了。以下是目前的HYORM支持的三个常用的Load重载方法

l         根据Type和int型主键加载实体:object Load(Type type, int primarykey);

l         根据Type和decimal型主键加载实体:object Load(Type type, decimal primarykey);

l         根据Type和Key加载实体:object Load(Type type, Key key);

 

上面介绍了三中Load方法,第一和第二种方法分别是针对int型和decimal型主键的,我比较喜欢用他们来做主键,这样的话速度会比较快。但是如果我们表的主键字段不是这两种类型的话又该怎么办呢,那么就要第三种方法来登场了

 

AbstractWorkUnit unit = new WorkUnit(XmlConfig.Instance());

 

KeyItem item = new KeyItem(PublishersEntity.C_PKID,7);

     Key key = new Key(item);

   

PublishersEntity publisher = unit.Load(typeof(PublishersEntity), key) as PublishersEntity;

 

 

2.        使用SelectCriteria获取数据

上面的方法只是根据主键来获取数据,那么我们如果要根据任意条件来获取多条数据又该如何呢。那就要用到SelectCriteria了:

AbstractWorkUnit unit = new WorkUnit(XmlConfig.Instance());

//使用SelectCriteria获取数据

        SelectCriteria sc = new SelectCriteria(typeof(BooksEntity),unit);

        //增加一个条件:PublisherId='1001'

        sc.AddCondition().EqualsTo(BooksEntity.C_PUBLISHERID, "1001");

        //增加一个条件:Subject like '%Apple%'

        sc.AddCondition().Like(BooksEntity.C_SUBJECT, "%Apple%");

        //前5条记录

        sc.Top = 5;

        //以ItemId降序排序

        sc.AddOrderBy(BooksEntity.C_ITEMID,false);

        //返回DataTable

   DataTable dt = sc.AsDataTable();

 

 

//使用SelectCriteria获取数据(使用AsList<T>)

        SelectCriteria sclist = new SelectCriteria(typeof(BooksEntity), unit);

        sclist.AddCondition().EqualsTo(BooksEntity.C_ITEMID, 6);

        this.GridView2.DataSource = sclist.AsList<BooksSearch>(typeof(BooksSearch));

this.GridView2.DataBind();

 

下面我就对以上的代码作一下解释:

首先,当然是声明一个工作单元unit;

然后,就是声明一个SelectCriteria的实例sc,传入实体的类类型和unit;

接着,就是增加And条件了

sc.AddCondition().EqualsTo(BooksEntity.C_PUBLISHERID, "1001");

到这里,可能有的人会问,那如果我要在and之间用Or条件呢,下面代码就可满足要求:

sc.AddCondition().AddOrCondition().EqualsTo(BooksEntity.C_PUBLISHERID, "1001");

 sc.AddCondition().AddOrCondition().Like(BooksEntity.C_SUBJECT, "%Apple%");

最后,SelectCriteria当然还支持Top,OrderBy,相信读者一看就明白了。

SelectCriteria只能支持简单的select语句,那么对于复杂的呢,比如说子查询,那只能用下面的方法了

 

3.        使用工作单元的Find方法执行复杂查询

AbstractWorkUnit unit = new WorkUnit(XmlConfig.Instance());

         StringBuilder sql = new StringBuilder(200);

         sql.Append("SELECT DISTINCT TOP 50 ");

sql.Append(" i.PKId,i.TypeId,b.PublisherId,b.ISBN,i.ImageFileSpec,i.Name AS Title,i.Description,i.UnitPrice,i.UnitCost,t.Name AS ItemType,p.Name AS PublisherName");

         sql.Append(" FROM Items i, ItemType t,Books b, Publishers p ,ItemCategory c");

sql.Append(" WHERE i.PKId = c.ItemId and b.ItemId = i.PKId AND t.PKId = i.TypeId AND p.PKId = b.PublisherId ");

 

            sql.Append(string.Format(" and  c.CategoryId = {0}", categoryId));

            sql.Append(" ORDER BY i.PKId");

 

            //DataTable dt = unit.Find(sql.ToString());

IList<BookSearchResult> result = unit.Find<BookSearchResult>(typeof(BookSearchResult), sql.ToString());

     

到现在为止,HYORM的获取数据方法都已经说完了,以后我会接着讲述更新数据的方法