前面介紹的IOrmAccesser是對單表進行ORM訪問,而ITableAccesser是對單表進行基於關係的訪問,如果我們要進行聯合查詢這樣的跨表搜索,則使用它們就無法達成目標。這時,你可以使用IRelationAccesser。與IOrmAccesser和ITableAccesser的針對性不同(它們針對數據庫中的某個表),IRelationAccesser針對的是整個目標數據庫。在DataRabbit中,所有的跨表操作推薦使用IRelationAccesser來完成(除非以後有更好的解決方案)。
IRelationAccesser將數據訪問分成兩類:Query和Command。Query返回DataSet,Command沒有返回值。另外,IRelationAccesser還支持執行帶有參數的查詢語句。
我們可以從DataRabbit的入口點IDataAccesser中獲取IRelationAccesser引用:
IRelationAccesser接口的完整定義如下,僅僅包含三個方法:
{
/// <summary>
/// DoCommand 執行數據命令
/// </summary>
void DoCommand(string command);
// <summary>
/// DoQuery 執行查詢數據
/// </summary>
DataSet DoQuery(string query);
/// <summary>
/// ExcuteRegularQuery 執行帶有參數的查詢語句,參數值由paraValues給出。
/// </summary>
/// <param name="regularQuery">帶參數的查詢語句</param>
/// <param name="paraPrefix">查詢語句中參數的前綴,該前綴可以用戶自定義</param>
/// <param name="paraValues">鍵爲參數名,不帶參數前綴</param>
DataSet ExcuteRegularQuery(string regularQuery, string paraPrefix, IDictionary<string, object> paraValues);
}
DataSet ds = relationAccesser.DoQuery(joinSelect);
//準備參數
IDictionary<string, object> dic = new Dictionary<string, object>();
dic.Add("ID", 1);//參數名不用帶參數前綴
//查詢
DataSet ds2 = relationAccesser.ExcuteRegularQuery(joinSelect, "@", dic);