none
Linq Select 欄位是否可以用變數 RRS feed

  • 問題

  • 之前在用SQLDataRead時,我們可以在SQL Command下

    string A="XXX" <--欄位名稱
    Sqlcomm="select "+A+ " from Table1"。 

    A的欄位名稱可以用外在傳值方式變更,改用Linq是否就沒有辦法呢?
    似乎沒有辦法做到
    Var a=from s in db.Table1
               select A;

    請問有辦法在Linq中也可以用欄位名稱用一個變數來代替呢?
    2009年3月17日 上午 05:23

所有回覆

  • 你指得是LINQ to SQL,Entity Framework還是LINQ to Object??
    三種技術答案會有不同.
    2009年3月18日 上午 08:13
  •  你這樣有差嗎?

    SELECT x FROM TableName 是依x變數,而傳回不同的欄位.
    在 from s in db.Table1
        select A
    雖然他結果是投射A 但他還是將 Table1 的整筆 Record 讀到記憶體後在投射.
    所以不具意義.
    我都是整筆取出,然後在DataBinding 去 Binding 所要的欄位.
    目前我有看到 LINQ 的一些下一版,但還沒看到相關方案.如過資料庫在本機或在內往沒差很多.但如果跨網域,而且欄位或關聯很多時,效能就差很多.
    2009年3月18日 上午 08:25
  •  我是Linq to SQL。
    若是用 from s in db.Table1   select A這樣的資料傳輸量不是比只傳一個欄位的資料傳輸量大嗎??
    還是我搞錯呢??
    2009年3月18日 下午 03:33
  • 你可以用另一種表達是看看.

    var query=db.Table1.Where(rd=>rd.xxxx=="xxxxxxx").OrderBy(rd=>rd.ID);

        switch (你的判斷式)
                {

                    case "ColumnA":
                           query=query.Select(rd=>rd.ColumnA);
                        break;
                       case "ColumnB":
                          query=query.Select(rd=>rd.ColumnB);
                        break;
                        default:
                          //沒有代表全部欄位.
                        break;
                }

    List<var> xx=query.ToList();
            }

    這種表達式我可以去組查詢字串,另一種表達式我還不會組.

    2009年3月20日 上午 07:43
  • 之前我也想過類似的問題。
    最後,我仍然是放棄了。

    Linq to SQL 是 static language, 最終的執行碼仍然是強型別的
    var a = from s in db.Table1
               select s.Field1;
    其實等同於
    var a = db.Table1.Select(f => f.Field1)

    注意到 a 仍然是(也必須)是強型別的。

    如果所選擇的欄位是傳入的變數,可想而知的 a 的型別就無法推斷, compile 自然會失敗了。

    這個問題,需要等到 c# 4.0 的 dynamic 才能有比較好的解決法式,也就是 dynamic language
    2009年4月13日 下午 10:08