一直没在网上写自己的心得,又总是看园子很多兄弟的文章。工作几年了,工作经验和人生感悟颇多的,中间夹杂着积极与消极、成功与失败,各种的体会只有自己明白,希望消极的心态不会影响到大家,积极的大家就凑合借鉴和学习一下,嘿嘿。
搞了很久的管理系统,能抽象出来的还是很少。最初在表示层做通用查询的时候,走了很多弯路,很是迷茫,在网上找了很多相关资料,有些做法是将所有字段列一个参数列表,通过值(是否为null或者string.Empty)来判断字段是否需要组合查询。比如说GetClients(int id,string name,int regionID,...),这种做法在改数据表字段时业务逻辑层还得重新对应相应的数据表字段。这样,查询字段要求和数据库的字段一一对应,做法很不合理,最终架构被否定了。后来,看了DynamicQuery源码后,我在实现通用查询时,通过界面上设置业务属性值,在业务逻辑层解析,而不是通过上面提到的参数组合,呵呵,轻松搞定了。它解决了通用查询条件组合的依赖,利用反射技术,直接对实体类属性进行条件组合查询。在变更数据库时,只需改变数据层的字段映射关系。现在用起来挺方便,唯一不足的是在业务逻辑层查询时,访问数据时都是加载所有的数据,没办法,只好考虑在业务逻辑层用数据缓存了。DynamicQuery没有实现Like关键字,我把Like关键字的分析加上了。下面是通用查询调用的大概步骤。
业务实体:
Code
///<summary>
///客户信息
///</summary>
[DataContract()]
public partial class TBClient : GR.Common.Entity
{
#region 私有变量
private int _ID;
private string _Name;
private int _RegionID;
private string _ClientType;
private string _ShortCode;
private string _Tel;
private string _LinkMan;
private string _Address;
private string _PostCode;
private string _AccountBank;
private string _AccountNo;
private string _TaxNo;
private string _Remark;
private Entities.TBRegion _Region = new Entities.TBRegion();
#endregion
#region 实体属性
///<summary>
///编号
///</summary>
[DataMember()]
public int ID
{
get { return _ID; }
set { this._ID = value; }
}
///<summary>
///客户名称
///</summary>
[DataMember()]
public string Name
{
get { return _Name; }
set { this._Name = value; }
}
///<summary>
///片区信息维护
///</summary>
[DataMember()]
[System.ComponentModel.Browsable(false)]
public int RegionID
{
get { return _RegionID; }
set { this._RegionID = value; }
}
///<summary>
///客户类别
///</summary>
[DataMember()]
public string ClientType
{
get { return _ClientType; }
set { this._ClientType = value; }
}
///<summary>
///简码
///</summary>
[DataMember()]
public string ShortCode
{
get { return _ShortCode; }
set { this._ShortCode = value; }
}
///<summary>
///联系电话
///</summary>
[DataMember()]
public string Tel
{
get { return _Tel; }
set { this._Tel = value; }
}
///<summary>
///联系人
///</summary>
[DataMember()]
public string LinkMan
{
get { return _LinkMan; }
set { this._LinkMan = value; }
}
///<summary>
///地址
///</summary>
[DataMember()]
public string Address
{
get { return _Address; }
set { this._Address = value; }
}
///<summary>
///邮政编码
///</summary>
[DataMember()]
public string PostCode
{
get { return _PostCode; }
set { this._PostCode = value; }
}
///<summary>
///开户银行
///</summary>
[DataMember()]
public string AccountBank
{
get { return _AccountBank; }
set { this._AccountBank = value; }
}
///<summary>
///银行账号
///</summary>
[DataMember()]
public string AccountNo
{
get { return _AccountNo; }
set { this._AccountNo = value; }
}
///<summary>
///税务登记号
///</summary>
[DataMember()]
public string TaxNo
{
get { return _TaxNo; }
set { this._TaxNo = value; }
}
///<summary>
///片区信息维护
///</summary>
[DataMember()]
[System.ComponentModel.Browsable(false)]
public Entities.TBRegion Region
{
get { return _Region; }
set { this._Region = value; }
}
#endregion
#region Overrides
public override bool Equals(object obj)
{
if (obj == null)
return false;
if (!obj.GetType().IsAssignableFrom(this.GetType()))
return false;
if (!(obj as TBClient).ID.Equals(_ID))
return false;
return true;
}
public override int GetHashCode()
{
return base.GetHashCode();
}
#endregion
}
界面层:
string strWhere = "Name like '有限公司' && Region.ID =10 ";
List<TBClient> = (new Clients()).Find(strWhere);
业务逻辑:
Code
public List<TBClient> GetClients()
{
List<TBClient> values =DataProvider.Instance().TBClients().OrderBy(c => c.ID).ToList();
return values;
}
public List<TBClient> Find(string where)
{
Expression<Func<TBClient, bool>> expr = DynamicExpression.ParseLambda<TBClient, bool>(where);
List<TBClient> values = GetClients().Where(expr.Compile()).ToList();
return values;
}
第一次写文章,希望大家给点指导。
修改后的DynamicQuery代码