在使用NHibernate中,经常使用查询,又不愿意去写,就写了这个东东,依对象的属性,通过反射来生成查询。
先来看一下使用方式:
一个Filter类:
Code
public class UserInfoFilter
{
private string logName = null;
private string name = null;
[HqlCondition( EnumHqlCondition.Like)]
public string LogName
{
get
{
if (string.IsNullOrEmpty(logName))
return null;
else
return logName;
}
set
{
logName = value;
}
}
[HqlCondition( EnumHqlCondition.Like)]
public string Name
{
get
{
if (string.IsNullOrEmpty(name))
return null;
else
return name;
}
set
{
name = value;
}
}
[HqlCondition]
public DicDept DicDept = null;
[HqlCondition("UserRole.RoleInfo", EnumHqlCondition.EQ)]
public RoleInfo RoleInfo = null;
[HqlCondition("DicUseFlag", EnumHqlCondition.NE)]
public DicUseFlag Deleted = DicUseFlag.CreateInstance((int)Enums.EnumUseFlag.Deleted);
[HqlOrder]
public string Order = "Id asc";
}
public class UserInfoFilter
{
private string logName = null;
private string name = null;
[HqlCondition( EnumHqlCondition.Like)]
public string LogName
{
get
{
if (string.IsNullOrEmpty(logName))
return null;
else
return logName;
}
set
{
logName = value;
}
}
[HqlCondition( EnumHqlCondition.Like)]
public string Name
{
get
{
if (string.IsNullOrEmpty(name))
return null;
else
return name;
}
set
{
name = value;
}
}
[HqlCondition]
public DicDept DicDept = null;
[HqlCondition("UserRole.RoleInfo", EnumHqlCondition.EQ)]
public RoleInfo RoleInfo = null;
[HqlCondition("DicUseFlag", EnumHqlCondition.NE)]
public DicUseFlag Deleted = DicUseFlag.CreateInstance((int)Enums.EnumUseFlag.Deleted);
[HqlOrder]
public string Order = "Id asc";
}
使用查询:
Code
public static IList<UserInfo> List(UserInfoFilter filter)
{
Debug.Assert(filter != null);
{
IQuery query = HqlQueryBuilder.BuildFilter<UserInfo>(filter);
return query.List<UserInfo>();
}
}
public static IList<UserInfo> List(UserInfoFilter filter)
{
Debug.Assert(filter != null);
{
IQuery query = HqlQueryBuilder.BuildFilter<UserInfo>(filter);
return query.List<UserInfo>();
}
}
下面是实现代码:
Code
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using System.Reflection;
6using System.Diagnostics;
7using NHibernate;
8using System.Collections;
9
10namespace Grain.Components.NHibernateHelper
11{
12
13 public class HqlQueryBuildParameter
14 {
15 private string name;
16
17 public string Name
18 {
19 get { return name; }
20 set { name = value; }
21 }
22
23 private MemberInfo memberInfo;
24
25 public MemberInfo MemberInfo
26 {
27 get { return memberInfo; }
28 set { memberInfo = value; }
29 }
30
31 private HqlValidateAttribute hqlAttribute;
32
33 public HqlValidateAttribute HqlAttribute
34 {
35 get { return hqlAttribute; }
36 set { hqlAttribute = value; }
37 }
38
39
40
41 private object value;
42
43 public object Value
44 {
45 get { return this.value; }
46 set { this.value = value; }
47 }
48
49 }
50
51
52 /**//// <summary>
53 /// 依一个Filter对象来生成IQuery
54 ///
55 /// </summary>
56 public class HqlQueryBuilder
57 {
58
59 private static object GetValue(MemberInfo mi,object obj)
60 {
61 if (mi is FieldInfo)
62 return ((FieldInfo)mi).GetValue(obj);
63 else if (mi is PropertyInfo)
64 return ((PropertyInfo)mi).GetGetMethod().Invoke(obj, null);
65 else
66 return null;
67 }
68
69 public static IQuery BuildFilter<T>(object filter)
70 {
71 return BuildFilter<T>(Database.Session, filter);
72 }
73
74 public static IQuery BuildFilter<T>(object filter, string hqlWhereEx)
75 {
76 return BuildFilter<T>(Database.Session, filter, hqlWhereEx);
77 }
78
79 public static IQuery BuildFilter<T>(ISession session, object filter)
80 {
81 return BuildFilter<T>(session, filter, string.Empty);
82 }
83
84 public static IQuery BuildFilter<T>(ISession session, object filter, string hqlWhereEx)
85 {
86 return BuildFilter(session, typeof(T), filter, hqlWhereEx);
87 }
88
89
90 public static IQuery BuildFilter(ISession session, Type type, object filter, string hqlWhereEx)
91 {
92 Type typeFilter = filter.GetType();
93 string typeClassName = type.Name;
94 string typeClassPrefix = new string((from c in typeClassName where char.IsUpper(c) == true select c).ToArray<char>()).ToLower();
95 string orderString = string.Empty;
96 List<HqlQueryBuildParameter> prms = new List<HqlQueryBuildParameter>
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using System.Reflection;
6using System.Diagnostics;
7using NHibernate;
8using System.Collections;
9
10namespace Grain.Components.NHibernateHelper
11{
12
13 public class HqlQueryBuildParameter
14 {
15 private string name;
16
17 public string Name
18 {
19 get { return name; }
20 set { name = value; }
21 }
22
23 private MemberInfo memberInfo;
24
25 public MemberInfo MemberInfo
26 {
27 get { return memberInfo; }
28 set { memberInfo = value; }
29 }
30
31 private HqlValidateAttribute hqlAttribute;
32
33 public HqlValidateAttribute HqlAttribute
34 {
35 get { return hqlAttribute; }
36 set { hqlAttribute = value; }
37 }
38
39
40
41 private object value;
42
43 public object Value
44 {
45 get { return this.value; }
46 set { this.value = value; }
47 }
48
49 }
50
51
52 /**//// <summary>
53 /// 依一个Filter对象来生成IQuery
54 ///
55 /// </summary>
56 public class HqlQueryBuilder
57 {
58
59 private static object GetValue(MemberInfo mi,object obj)
60 {
61 if (mi is FieldInfo)
62 return ((FieldInfo)mi).GetValue(obj);
63 else if (mi is PropertyInfo)
64 return ((PropertyInfo)mi).GetGetMethod().Invoke(obj, null);
65 else
66 return null;
67 }
68
69 public static IQuery BuildFilter<T>(object filter)
70 {
71 return BuildFilter<T>(Database.Session, filter);
72 }
73
74 public static IQuery BuildFilter<T>(object filter, string hqlWhereEx)
75 {
76 return BuildFilter<T>(Database.Session, filter, hqlWhereEx);
77 }
78
79 public static IQuery BuildFilter<T>(ISession session, object filter)
80 {
81 return BuildFilter<T>(session, filter, string.Empty);
82 }
83
84 public static IQuery BuildFilter<T>(ISession session, object filter, string hqlWhereEx)
85 {
86 return BuildFilter(session, typeof(T), filter, hqlWhereEx);
87 }
88
89
90 public static IQuery BuildFilter(ISession session, Type type, object filter, string hqlWhereEx)
91 {
92 Type typeFilter = filter.GetType();
93 string typeClassName = type.Name;
94 string typeClassPrefix = new string((from c in typeClassName where char.IsUpper(c) == true select c).ToArray<char>()).ToLower();
95 string orderString = string.Empty;
96 List<HqlQueryBuildParameter> prms = new List<HqlQueryBuildParameter>
作者: fascinate
- 该日志由 fascinate 于13年前发表在综合分类下,最后更新于 2011年07月15日.
- 转载请注明: HqlBuilder | 学步园 +复制链接
抱歉!评论已关闭.