隨然做過幾年.net開發,但一直沒有做過MVC框架下的網站,這段時間無事,學習一下。下面的方法是我摸索過程中的一點總結,如果有更好的方法,歡迎告訴我,謝謝。
這段時間我只看了MVC和LinQ兩本書,關於EF我是沒看的,所以我的這個網站的數據層打算直接使用LinQ完成。今天准備開發了,才發現讀數據是個問題,汗呀~~~
現在總結兩種方法:
1.手寫實體對象。
思路:寫一個包含所有字段屬性的實體類對象,使用LinQ將數據查詢出后,經過一個轉換器將數據轉換為IList<T>類型,返回給視圖顯示。
1.實體類對象。
public class IndexAtriclList
{
/// <summary>
/// 主鍵ID
/// </summary>
public int ID { get; set; }
/// <summary>
/// 標題
/// </summary>
public string Title { get; set; }
/// <summary>
/// 創建時間
/// </summary>
public DateTime CreateTime { get; set; }
/// <summary>
/// 創建人
/// </summary>
public string UserName { get; set; }
}
2.讀取數據。
DataClasses1DataContext context=new DataClasses1DataContext(); //方法1 var query = from a in context.GetTable<Articles>() join m in context.GetTable<Members>() on a.AutherID equals m.ID orderby a.CreateTime select new IndexAtriclList { ID = a.ID, Title = a.Title, CreateTime = a.CreateTime, UserName = m.UserName }; var list = Common.ToList<IndexAtriclList>(query);
return View(list);
上面這段代碼中DataClasses1DataContext是LinQ To SQL設計器自動生成的代碼,包括了DataContext對象及所有數據表映射。
Common.ToList是我寫的一個轉換器,下面會說到。
Articles,Members是LinQ的數據表映射,IndexAtriclList是第1步生成的實體對象。
3.轉換數據
public class Common { public static List<T> ToList<T>(IEnumerable<T> data) { List<T> list=new List<T>(); var propertys = System.ComponentModel.TypeDescriptor.GetProperties(typeof(T)); foreach (var item in data) { T t = Activator.CreateInstance<T>(); Type type = t.GetType(); foreach (System.ComponentModel.PropertyDescriptor p in propertys) { object o=p.GetValue(item); t.GetType().GetProperty(p.Name).SetValue(t, o, null); } list.Add(t); } return list; } }
這里我用到了泛型,想的是方法的復用,主要是想省事。
4.視圖顯示
@model IList<IndexAtriclList> <h2>Index</h2> <table border="1"> <thead> <tr> <td>標題</td> <td>發布日期</td> </tr> </thead> @{ foreach (var item in Model) { <tr> <td>@item.Title</td> <td>@item.CreateTime</td> </tr> } } </table>
ok,到這里第一種方法完成。但是我還沒想明白,如果這么做的話,手寫及維護實例類就是一項艱巨的工作,不知是我的思路不對,還是有更好的方法,希望大家指正。
2.存儲過程
思路:在sql server中寫一個返回結果集的存儲過程,LinQ直接調用即可。(這個方法真是太方便了,兩分鍾搞寫)
1.在Sql Server中寫存儲過程
Create proc IndexArticleList as select a.ID,Title,a.CreateTime,m.UserName from Articles a inner join Members m on a.AutherID=m.ID go
2.調用存儲過程
DataClasses1DataContext context = new DataClasses1DataContext(); //方法2 var list = context.IndexArticleList().ToList();
return View(list);
3.視圖顯示,方法同第1種方法。
這個方法不用我們維護實體類,LinQ會根據存儲過程自動生成對應的類。我們可以在LinQ的designer.cs上看到生成的對象。
public partial class IndexArticleListResult { private int _ID; private string _Title; private System.DateTime _CreateTime; private string _UserName; public IndexArticleListResult() { } [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_ID", DbType="Int NOT NULL")] public int ID { get { return this._ID; } set { if ((this._ID != value)) { this._ID = value; } } } ......................
如果有一個復雜的查詢邏輯,我們可以寫在存儲過程中,提升性能。
我在測試當中,發現LinQ對返回多結果集的存儲過程支持並不好,每次辛辛苦苦改了LinQ的映射文件,一刷新又變回去了。不知道該說什么了。關於返回多結果集的方法,我會在下一篇中總結。
