使用篇之获取数据
我们想要从数据库中获取或更新数据,无非是使用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());
浙公网安备 33010602011771号