none
EntityFramework欄位動態取用? RRS feed

  • 問題

  • 我是使用 .Net4.0 VS2010 C#
    有一個舊的Method要升級,大致上架構如下
    public DataSet QueryMember(string ColumnName)
    {
        string tsql="SELECT " + ColumnName + " FROM MemberData";
        ...
        DataSet ds;
        TestAdapter.Fill(ds, "Member");
        return ds;
    }

    舊有程式又爛又易被駭
    現在我要使用EntityFramework4先改寫成相容的版本
    主要是本的程式他要動態傳進ColumnName
    但是EF取出來的EntityModel 都已經變成 property
    那我該如何將傳入的 string 轉為相對應的 property 呢?
    2012年4月11日 上午 02:04

解答

所有回覆

  • 看不太懂,你是已經取出物件集合了嗎?
    2012年4月11日 上午 03:10
  • 你可以考慮改用匿名型別或用 SelectMany() 去處理你的需求。

    EF 本身也有 ExecuteStoreQuery() 來執行自訂查詢,但這等於失去了 ORM 的優點。

    http://msdn.microsoft.com/zh-tw/library/system.data.objects.objectcontext.executestorequery.aspx


    學習不是查個 Google 套個書上的範例就算了,而是去熟悉了解每個程式碼背後的意義,否則就算學個幾百年,它也不會是你的。
    =================================
    小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
    雲端學堂Facebook: http://www.facebook.com/studyazure

    2012年4月11日 上午 03:23
    版主
  • 主要是本的程式他要動態傳進ColumnName
    但是EF取出來的EntityModel 都已經變成 property
    那我該如何將傳入的 string 轉為相對應的 property 呢?
    EF是ORM,應該不能動態傳進ColumnName

    大家一齊探討、學習和研究,謝謝!
    Microsoft MVP, Microsoft Community Star(TW & HK), MCT,
    MCSD, MCAD, MCSE+I, MCDBA, MCDST, MCSA, MCTS, MCITP, MCPD
    MVP for VB.NET since 2003

    2012年4月11日 上午 03:29
  • 我把我遇到的困難點寫的明確一點

    新的程式當然就不用這麼麻煩
    直接取出整份IQueryable<T>.TolList()
    然後回傳List<T>即可
    反正外部就直接對模型做操作了

    但是就是舊有程式還是使用DataSet的邏輯處理
    為了相容舊有程式,我還是要把舊的商業邏輯輸出DataSet

    舊程式邏輯
    public DataSet QueryMember(string ColumnName)
    {
        string tsql="SELECT " + ColumnName + " FROM MemberData";
        ...
        DataSet ds;
        TestAdapter.Fill(ds, "Member");
        return ds;
    }

    目前想法是轉成如下
    public DataSet QueryMember(string ColumnName))
    {
        //建立目標DataTable
        DataTable ReturnTable = new System.Data.DataTable();
        string[] Columns=ColumnName.Split(","[0]);
        foreach (var col in Columns)
        {
            System.Data.DataColumn dc = new System.Data.DataColumn(col);
            ReturnTable.Columns.Add(dc);
        }

        //動態填入資料
        using(TestEntities testdb=new TestEntities())
        {
            List<MemberData> Members=testdb.MemberData.ToList();
            DataRow dr;
            foreach (var member in Members)
            {
                dr = ReturnTable.NewRow();
                foreach (var col in Columns)
                {
                    dr[col] = member.GetProperty(col); //困難點在此,不明白GetProperty()如何實作
                }
                ReturnTable.Rows.Add(dr);
            }
        }    

        //輸出元邏輯需要的DataSet
        DataSet ds= new DataSet();
        ds.Tables.Add(ReturnTable);
        return ds;
    }

    GetProperty()是我自己亂想的Method
    但是實際上EntityModel我沒找到這個功能
    我想問的是有沒有可以實做出來的方法?

    例如輸入member.GetProperty("Name") 就可以取得 member.Name 的值這樣??


    • 已編輯 小小郭 2012年4月12日 上午 03:29
    2012年4月12日 上午 03:27
  • http://www.dotblogs.com.tw/regionbbs/archive/2011/11/10/orm.internals.part.1.how.to.bind.object.and.data.aspx

    學習不是查個 Google 套個書上的範例就算了,而是去熟悉了解每個程式碼背後的意義,否則就算學個幾百年,它也不會是你的。
    =================================
    小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
    雲端學堂Facebook: http://www.facebook.com/studyazure

    • 已標示為解答 小小郭 2012年4月12日 上午 05:51
    2012年4月12日 上午 03:50
    版主
  • 或許你可以參考這篇討論。

    http://stackoverflow.com/questions/498597/linq-is-it-possible-with-dynamic-linq-to-dynamically-specify-the-from-clause


    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/

    2012年4月12日 上午 05:17
  • 感謝各位幫忙

    使用Reflection成功了

    2012年4月12日 上午 05:53