none
請問如何傳進不同table在function裡面寫linq RRS feed

  • 問題

  • 不知道如何下標題,也不知道這個應該如何google,只好來求助一下各位高手。

    我有兩段長得很像的linq,可能只是某個table不一樣,所以想包成function,然後傳進不同的table就好了,問題是我不知道在傳進去的參數應該怎麼寫。

    程式碼示例比如

    msg=GetMSG(db1.table);
    
    public string GetMSG(如何寫參數?? db1.table)
    {
     var result=from a in db1.table;
    }
    

    2013年12月19日 上午 01:38

解答

  • 如果你的 "替換table" 和 "換table" 都是回傳同一個 IEnumerable<T> 型別的話,就可以這樣做:

    public IEnumerable<object> GetTable<T>(string TableName)
    {
        switch (TableName)
        {
             case "A":
                return db.A;
             case "B":
                return db.B;
             default:
                return null;
        }
    }
    
    
    var query = from item in GetTable("MyTable")
                          select item;
    
    // ...



    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    • 已標示為解答 kinanson 2013年12月25日 上午 07:31
    2013年12月25日 上午 06:08
    版主

所有回覆

  • 你的 Table 的基礎型別是什麼?

    用基礎型別來宣告就行了。

    不過最好的情況還是運用一些 pattern 來封裝。


    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    2013年12月19日 上午 02:57
    版主
  • 感謝,但是因為我的linq寫得有點小複雜,所以用Dynamic Query有點難寫,我也不知道應該怎麼寫.........我寫的例子只是舉個比方而已.............我只是想要在function動態把table丟進去,可以取代db1.table這樣子
    2013年12月19日 上午 06:54
  • 你的 Table 的基礎型別是什麼?

    用基礎型別來宣告就行了。

    不過最好的情況還是運用一些 pattern 來封裝。


    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    小朱版主講的意思是什麼,坦白說我不太清楚,如果以我看到的基礎型別是Entity.Dbset<table>...........但這個table我想要動態自己選擇傳進哪個table...............
    2013年12月19日 上午 06:56
  • 如果來源 table 個數固定,可考慮用 switch (tableName) 去對應相對的語法。

    http://stackoverflow.com/questions/16429859/dynamic-queries-change-table-name-in-linq-to-entities-query


    理直氣和,切記。

    Blog: http://blog.kkbruce.net

    Book:《ASP.NET MVC 4 網站開發美學


    • 已編輯 KKBruceMVP 2013年12月19日 上午 09:08 新增資訊
    2013年12月19日 上午 09:07
  • 基本上,定義成泛型參數是你要的答案的第一步

    public string GetMSG<T>(IQueryable<T> source)
    {
    // ... your code
    }

    但問題是,如果你的 table 不具備一致的介面,那 function 裡面可以做的事情恐怕不多(或不易) 

    然後也沒看見 function 的功能舉例,所以能提供你的資訊有限


    dino

    2013年12月23日 下午 05:51
  • 如果自已的基礎不穩固,不要想去做高級的技法...

    先充實泛型和介面等基礎,學好 Pattern 後再來思考這個問題吧。

    否則就算我們給你方向,可能你也看不懂 ...


    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    2013年12月23日 下午 11:54
    版主
  • 有刪減了一些部份,這兩段程式碼非常像,就只有from a in db1.table,這邊不一樣,其餘寫法一樣,所以我想包成一個function,以前寫ado.net,可能只要傳個變數table進去取代就好了,用成linq反而不知道應該怎麼寫了...........目前是完全重覆的程式碼寫法,雖然也可以執行,但覺得很不蘇服...............所以才會上來提問。

    if (sales.StartsWith("1"))
                {
                    var Contract = from a in db1.contract (替換table)
                                   join b in db1.bb
                                   on a.產品代碼 equals b.產品代碼
                                   join c in db1.cc
                                   on a.索引編號 equals c.索引編號
                                   where a.索引編號 == IndexID
                                   select new
                                   {
                                       b.產品名稱,
                                       ExpireDay = a.產品代碼 == "001" || a.產品代碼 == "004" ? c.維護到期日 : a.合約迄日
                                   };              
                }
                else
                {
                    var Contract = from a in db1.cont2TC (換table)
                                   join b in db1.bb
                                   on a.產品代碼 equals b.產品代碼
                                   join c in db1.cc
                                   on a.索引編號 equals c.索引編號
                                   where a.索引編號 == IndexID
                                   select new
                                   {
                                       b.產品名稱,
                                       ExpireDay = a.產品代碼 == "001" || a.產品代碼 == "004" ? c.維護到期日 : a.合約迄日
                                   };

                }

                   
    2013年12月25日 上午 01:32
  • 小朱版主說得是,有時間的話,是真的該去好好充實泛型的知識
    2013年12月25日 上午 01:32
  • 如果你的 "替換table" 和 "換table" 都是回傳同一個 IEnumerable<T> 型別的話,就可以這樣做:

    public IEnumerable<object> GetTable<T>(string TableName)
    {
        switch (TableName)
        {
             case "A":
                return db.A;
             case "B":
                return db.B;
             default:
                return null;
        }
    }
    
    
    var query = from item in GetTable("MyTable")
                          select item;
    
    // ...



    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    • 已標示為解答 kinanson 2013年12月25日 上午 07:31
    2013年12月25日 上午 06:08
    版主
  • 說一下狀況,這方法確實是可以傳進不同的table,但好像無法存取屬性(table的欄位),我寫法是這樣子..........好像還是無法解決我的問題。

    public IEnumerable<object> GetTable<T>(string TableName)
    {
        switch (TableName)
        {
             case "A":
                return db.A;
             case "B":
                return db.B;
             default:
                return null;
        }
    }
    
    
    var query = from item in GetTable<A>("A")
                          select item;

    2013年12月27日 上午 12:59
  • 你把 object 換成你那些 Table 元素的型別就可以了...

    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    2013年12月27日 上午 09:43
    版主