前兩天因?yàn)轫?xiàng)目需要,接觸到了Linq to Entities,打算寫個(gè)通用的分頁(yè)類。如果是用實(shí)體類型來做返回類型的話,是很簡(jiǎn)單的,但是當(dāng)使用了join之類的多表查詢后,返回的卻是一個(gè)匿名類型。怎么放也放不進(jìn)我寫的通用分頁(yè)類里,我嘗試把匿名類型轉(zhuǎn)換為Object,就是,把System.Linq.IQueryable<匿名類型>強(qiáng)制轉(zhuǎn)換為System.Linq.IQueryable<Object>會(huì)報(bào)錯(cuò)說不能轉(zhuǎn)換的,后來,用System.Linq.IQueryable<匿名類型>.Cast<object>()這個(gè)方法,嘗試轉(zhuǎn)為System.Linq.IQueryable<Object>,的確轉(zhuǎn)成功了,但是,更郁悶的問題又出現(xiàn)了,
當(dāng)ToList()的時(shí)候,又提示我“匿名類型轉(zhuǎn)Object錯(cuò)誤了”,暈...折騰了一天,終于搞出一個(gè)通用的分頁(yè)類。以下是源碼。
本人第一次寫文章,表達(dá)能力和寫作能力都不太好,此代碼的確是比較簡(jiǎn)單,希望高手們不要見笑...謝謝。
1 private void Form1_Load(object sender, EventArgs e)
2 {
3 Northwind db = new Northwind();
4
5 //創(chuàng)建查詢語(yǔ)句
6 var query = (from t1 in db.exClass
7 join t2 in db.exClassCon
8 on t1.ClassID equals t2.ClassID into it2
9 orderby t1.ClassID descending
10 select new
11 {
12 t1,
13 count = it2.Count()
14 });
15
16 //實(shí)例化對(duì)象
17 var datalist = DataList<object>.Create(query, //查詢語(yǔ)句
18 new { t1 = (exClass)null, count = 0 }, //定義一個(gè)相同結(jié)構(gòu)的匿名空類
19 1, 5); //頁(yè)碼和每頁(yè)大小
20
21 dataGridView1.DataSource = datalist.Value;
22
23 MessageBox.Show("當(dāng)前頁(yè):" + datalist.IndexPage.ToString() + "\r\n" +
24 "最大頁(yè):" + datalist.PageCount.ToString() + "\r\n" +
25 "當(dāng)前記錄數(shù):" + datalist.ThisPageRecordCount.ToString() + "\r\n" +
26 "總記錄數(shù):" + datalist.AllRecordCount.ToString() + "\r\n" +
27 "第一頁(yè):" + datalist.CanFirstPage.ToString() + "\r\n" +
28 "上一頁(yè):" + datalist.CanPrevPage.ToString() + "\r\n" +
29 "下一頁(yè):" + datalist.CanNextPage.ToString() + "\r\n" +
30 "最后一頁(yè):" + datalist.CanLastPage.ToString() + "\r\n");
31
32 }
33
34 /**//// <summary>
35 /// 數(shù)據(jù)列表
36 /// </summary>
37 /// <typeparam name="T">類型</typeparam> 38 public class DataList<T> : IEnumerable
39 {
40 成員變量#region 成員變量
41
42 private System.Linq.IQueryable<T> query;
43 private int allRecordCount;
44 private int thisPageRecordCount;
45 private int pageSize;
46 private int pageCount;
47 private int indexPage;
48 private bool canFirstPage;
49 private bool canPrevPage;
50 private bool canNextPage;
51 private bool canLastpage;
52 private List<T> listValue;
53
54 #endregion
55
56 構(gòu)造函數(shù)#region 構(gòu)造函數(shù)
57
58 //私有構(gòu)造函數(shù),只能通過內(nèi)部構(gòu)造
59 private DataList(System.Linq.IQueryable<T> Query, int IndexPage, int PageSize)
60 {
61 query = Query;
62 indexPage = IndexPage;
63 pageSize = PageSize;
64
65 Update();
66 }
67
68 private DataList(System.Linq.IQueryable<T> Query)
69 : this(Query, 1, 0) { }
70
71 #endregion
72
73 屬性#region 屬性
74
75 public int AllRecordCount
76 {
77 get { return allRecordCount; }
78 }
79
80 public int ThisPageRecordCount
81 {
82 get { return thisPageRecordCount; }
83 }
84
85 public int PageSize
86 {
87 get { return pageSize; }
88 set { pageSize = value; }
89 }
90
91 public int PageCount
92 {
93 get { return pageCount; }
94 }
95
96 public int IndexPage
97 {
98 get { return indexPage; }
99 set { indexPage = value; }
100 }
101
102 public bool CanFirstPage
103 {
104 get { return canFirstPage; }
105 }
106
107 public bool CanPrevPage
108 {
109 get { return canPrevPage; }
110 }
111
112 public bool CanNextPage
113 {
114 get { return canNextPage; }
115 }
116
117 public bool CanLastPage
118 {
119 get { return canLastpage; }
120 }
121
122 public List<T> Value
123 {
124 get { return listValue; }
125 }
126
127 #endregion
128
129 索引器#region 索引器
130
131 public T this[int index]
132 {
133 get { return listValue[index]; }
134 set { listValue[index] = value; }
135 }
136
137 #endregion
138
139 公開方法#region 公開方法
140
141 /**//// <summary>
142 /// 創(chuàng)建自身實(shí)例
143 /// </summary>
144 /// <typeparam name="N">類型,如果此處為匿名類型,請(qǐng)用var 定義實(shí)體,且類后的T為object(其實(shí)什么也不重要,只是用于可以調(diào)用當(dāng)前類的靜態(tài)方法)</typeparam>
145 /// <param name="Query">Linq查詢語(yǔ)句</param>
146 /// <param name="type">元素類型</param>
147 /// <param name="IndexPage">開始頁(yè)</param>
148 /// <param name="PageSize">每頁(yè)大小</param>
149 /// <returns></returns>
150 public static DataList<N> Create<N>(System.Linq.IQueryable Query, N type, int IndexPage, int PageSize)
151 {
152 System.Linq.IQueryable<N> query = (System.Linq.IQueryable<N>)Query;
153 return new DataList<N>(query, IndexPage, PageSize);
154 }
155
156 public static DataList<N> Create<N>(System.Linq.IQueryable Query, int IndexPage, int PageSize)
157 {
158 return Create<N>(Query, IndexPage, PageSize);
159 }
160
161 /**//// <summary>
162 /// 更新數(shù)據(jù)
163 /// </summary>
164 public virtual void Update()
165 {
166 allRecordCount = query.Count();
167
168 if (pageSize > 0)
169 {
170 query = query.Skip((indexPage - 1) * pageSize).Take(pageSize);
171
172 thisPageRecordCount = query.Count();
173
174 //計(jì)算分頁(yè)結(jié)果
175 pageCount = (allRecordCount % pageSize == 0) ? (allRecordCount / pageSize) : allRecordCount / pageSize + 1;
176 if (indexPage > 1) canFirstPage = true; canPrevPage = true;
177 if (indexPage < pageCount) canNextPage = true; canLastpage = true;
178 }
179 else
180 {
181 thisPageRecordCount = allRecordCount;
182 pageCount = indexPage = 1;
183 canFirstPage = canPrevPage = canNextPage = canLastpage = false;
184 }
185
186 listValue = query.ToList();
187 }
188
189 /**//// <summary>
190 /// 實(shí)現(xiàn)枚舉接口,不過返回的是object
191 /// </summary>
192 /// <returns></returns>
193 public IEnumerator GetEnumerator()
194 {
195 return listValue.GetEnumerator();
196 }
197
198 #endregion
199 }