MVC多表聯合查詢數據顯示


隨然做過幾年.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的映射文件,一刷新又變回去了。不知道該說什么了。關於返回多結果集的方法,我會在下一篇中總結。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM