首先看一下结构图(基于Subsonic 2.2):
1.代码引用:
Subsonic
System
System.Data
System.XML
2.表单Form类:
using System.Collections.Specialized;
using SubSonic;
namespace Reuse.Operater
{
public sealed class Form<T> where T : ReadOnlyRecord<T>, new()
{
NameValueCollection itemsForm;
public NameValueCollection ItemsForm { get { return itemsForm; } set { itemsForm = value; } }
public NameValueCollection CopyForm()
{
NameValueCollection form = new NameValueCollection();
foreach (string key in ItemsForm.AllKeys)
{
form.Add(key, ItemsForm[key]);
}
return form;
}
public T GetEntity(T entity)
{
foreach (string itemForm in ItemsForm.AllKeys)
{
entity.SetColumnValue(itemForm, ItemsForm[itemForm]);
}
return entity;
}
}
}
3.父类AbstractOperater类:
using System.Collections.Specialized;
using SubSonic;
namespace Reuse.Operater
{
public abstract class AbstractOperater<T>
where T : ReadOnlyRecord<T>, new()
{
protected Form<T> form;
protected Form<T> Form { get { return form; } set { form = value; } }
public AbstractOperater(NameValueCollection itemsForm)
{
Form = new Form<T>();
Form.ItemsForm = itemsForm;
}
}
}
4.Add类:
using System.Collections.Specialized;
using SubSonic;
namespace Reuse.Operater
{
public class Add<T> : AbstractOperater<T>
where T : ActiveRecord<T>, new()
{
protected T entity = new T();
public T Entity { get { return entity; } set { entity = value; } }
private object primaryKey;
public object PrimaryKey { get { return primaryKey; } private set { primaryKey = value; } }
public Add(NameValueCollection itemsForm)
: base(itemsForm)
{
Mark();
}
public NameValueCollection CopyForm()
{
return Form.CopyForm();
}
public void Save()
{
Entity.Save();
PrimaryKey = Entity.GetPrimaryKeyValue();
}
public void DirectSave()
{
GetEntity();
Save();
}
protected virtual void Mark()
{
Entity = new T();
Entity.MarkNew();
}
public T GetEntity()
{
return Form.GetEntity(Entity);
}
}
}
5.Edit类:
using System.Collections.Specialized;
using SubSonic;
namespace Reuse.Operater
{
public sealed class Edit<T> : Add<T>
where T : ActiveRecord<T>, new()
{
public Edit(NameValueCollection itemsForm)
: base(itemsForm)
{
Mark();
}
protected override void Mark()
{
base.Entity = new T();
base.Entity.MarkOld();
}
}
}
6.Detail类:
using System.Collections.Specialized;
using SubSonic;
namespace Reuse.Operater
{
public sealed class Detail<T> : AbstractOperater<T>
where T : ReadOnlyRecord<T>, new()
{
public Detail(NameValueCollection itemsForm)
: base(itemsForm)
{
}
public T LoadByCode()
{
T entity = InitEntity();
entity.LoadByKey(GetCode());
return entity;
}
public T LoadByParam(string columnName, string code)
{
T entity = InitEntity();
entity.LoadByParam(columnName, code);
return entity;
}
private T InitEntity()
{
T entity = new T();
return entity;
}
private string GetCode()
{
return Form.ItemsForm["code"];
}
}
}
7.Delete类:
using System.Collections.Specialized;
using SubSonic;
namespace Reuse.Operater
{
public sealed class Delete<T> : AbstractOperater<T>
where T : ActiveRecord<T>, new()
{
private SqlQuery sqlQuery;
public SqlQuery SqlQuery { get { return sqlQuery; } set { sqlQuery = value; } }
public Delete(NameValueCollection itemsForm)
: base(itemsForm)
{
SqlQuery = new Delete().From<T>();
}
public int DirectDelete(string colName, object value)
{
return SqlQuery.Where(colName).IsEqualTo(value).Execute();
}
public int DirectDelete()
{
T entity = new T();
string code = Form.ItemsForm["code"];
return SqlQuery.Where(entity.GetSchema().PrimaryKey.ColumnName).IsEqualTo(code).Execute();
}
}
}
8.List类:
using System.Collections.Specialized;
using System.Data;
using SubSonic;
namespace Reuse.Operater
{
public sealed class List<T> : AbstractOperater<T>
where T : ReadOnlyRecord<T>, new()
{
private SqlQuery sqlQuery;
public SqlQuery SqlQuery { get { return sqlQuery; } set { sqlQuery = value; } }
delegate void isEquals(string itemForm, string value);
isEquals isEqualsDelegate;
private bool loadedFlag = false;
private int currentPage;
private int CurrentPage { get { return currentPage; } set { currentPage = value; } }
private int pageSize;
private int PageSize { get { return pageSize; } set { pageSize = value; } }
private int recordCount;
public int RecordCount { get { return recordCount; } private set { recordCount = value; } }
public List(NameValueCollection itemsForm)
: base(itemsForm)
{
SqlQuery = new Select().From<T>();
}
public NameValueCollection CopyForm()
{
return Form.CopyForm();
}
public void GetSqlquery()
{
Form.ItemsForm = CopyForm();
if (IsPresice())
{
isEqualsDelegate += new List<T>.isEquals(GetEquals);
}
else
{
isEqualsDelegate += new List<T>.isEquals(GetLike);
}
foreach (string itemForm in Form.ItemsForm.AllKeys)
{
loadedFlag = false;
string value = Form.ItemsForm[itemForm];
if (!loadedFlag) IsPresice(itemForm, value);
if (!loadedFlag) IsDateStart(itemForm, value);
if (!loadedFlag) IsDateEnd(itemForm, value);
if (!loadedFlag) IsCurrentPage(itemForm, value);
if (!loadedFlag) IsPageSize(itemForm, value);
isEqualsDelegate(itemForm, value);
}
}
public DataSet GetDataSet()
{
RecordCount = SqlQuery.GetRecordCount();
if (CurrentPage > 0 && PageSize > 0)
SqlQuery.Paged(CurrentPage, PageSize);
isEqualsDelegate = null;
return SqlQuery.ExecuteDataSet();
}
public DataSet DirectList()
{
GetSqlquery();
return GetDataSet();
}
private void GetEquals(string itemForm, string value)
{
if (!loadedFlag) IsEqualTo(itemForm, value);
}
private void GetLike(string itemForm, string value)
{
if (!loadedFlag) IsLike(itemForm, value);
}
private bool IsPresice()
{
string precise = Form.ItemsForm["Presice"];
Form.ItemsForm.Remove("Presice");
if (string.IsNullOrEmpty(precise))
{
return false;
}
if (precise.Equals("1"))
{
return false;
}
return true;
}
private void IsPresice(string itemForm, string value)
{
if (itemForm.EndsWith("__jq"))
{
SqlQuery.And(itemForm.Remove(itemForm.Length - 4, 4)).IsEqualTo(value);
loadedFlag = true;
}
}
private void IsEqualTo(string itemForm, string value)
{
SqlQuery.And(itemForm).IsEqualTo(value);
}
private void IsLike(string itemForm, string value)
{
SqlQuery.And(itemForm).Like("%" + value + "%");
}
private void IsCurrentPage(string itemForm, string value)
{
if (itemForm.Equals("page"))
{
int result;
if (int.TryParse(value, out result))
{
CurrentPage = result;
loadedFlag = true;
}
}
}
private void IsPageSize(string itemForm, string value)
{
if (itemForm.Equals("rows"))
{
int result;
if (int.TryParse(value, out result))
{
PageSize = result;
loadedFlag = true;
}
}
}
private void IsDateStart(string itemForm, string value)
{
if (itemForm.EndsWith("__ds"))
{
SqlQuery.And(itemForm.Remove(itemForm.Length - 4, 4)).IsGreaterThanOrEqualTo(value);
loadedFlag = true;
}
}
private void IsDateEnd(string itemForm, string value)
{
if (itemForm.EndsWith("__de"))
{
SqlQuery.And(itemForm.Remove(itemForm.Length - 4, 4)).IsLessThanOrEqualTo(value);
loadedFlag = true;
}
}
}
}
9.使用方法:
1).前台页面以表单(Form)形式提交页面时一般处理程序(.ashx)或后台页面(.cs)接收页面将接收到的Context.Request.Form传给该方法即可直接保存或获取详细。
2).表单必须与实体类属性名称一致,可加后缀“__jq”(精确查找)、“__ds” (日期开始)、“__de”(日期结束)等来标注相应查询方式。
3).“Presice”为是否精确查询。
欢迎各位批评指点。