识别表单为Subsonic实体(适合于easyui)

    首先看一下结构图(基于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”为是否精确查询。


    欢迎各位批评指点。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值