none
LINQ to Entity table繼承問題 RRS feed

  • 問題

  • 目前用Linq to Entity +entity framework作一個系統

    entity裡有四個table
    post(postid,kindid)
    file(fileid, postid, filename)
    hyperfile(postid, hyperlink)
    realfile(postid, path)

    若有資料如下
    post[1,1;2,1;3,2]共三筆資料
    file[1,1,1.rar; 2,2,2.rar]二筆
    hyperfile[1,http://.... ]一筆
    realfile[2,c:\...]


    其中hyperlink、realfile 二個table繼承自file table

    我想用linq to entity將資料取出,放入datagrid

    希望結果是:

    postid       filename        link
    1               1.rar           http://...
    2               2.rar           c:\...
    3        

    為了達成以上的結果,使用full outer join
    我下的linq是:

    var query = from i in db.file
                      join p in db.post on i.postid equals p.postid into temp
                      from t in temp.DefaultIfEmpty()
                               
                      select new {t.postid,  i.filename};

    目前只想到這樣做,但這樣的結果只把post和file做join

    不知道接下來應該怎麼改?

    有想到一個方法:將file 作object
              hyperfile是繼承file的object
              realfile也是繼承file的object

    但是接下來也不知道怎麼做了,哈哈~~請問大家的意見囉。謝謝^^
    2009年12月31日 上午 02:47

解答

  • 1.LINQ to Entity 就是 Entity Framework
    2.Entity Framework是微軟目前主要的ORM解決方案

    繼承當然是基本功能之一.
    後續微軟大多數的與資料存取有關的框架(WCF data service等),都是以EF為基礎.

    另外如果你要正式運用EF這類ORM solution於專案內,給個建議,如果程式設計思維無法使用OO方式撰寫,使用後弊大利,如果程式還是使用程序式方式撰寫,使用ADO.Net反而比較合適.
    因你上面的LINQ語法,很明顯的在思維上還是程序式的模式在思考,因為如果Entity Model用OO方式思考來設計,LINQ中的JOIN用到機會不大.

    • 已標示為解答 Lolota Lee 2010年1月4日 上午 05:30
    2009年12月31日 上午 03:36

所有回覆

  • 這是標準的物件導向中多型的問題,非EF.
    解決方式很簡單在file新增一個屬性為link,並宣告為 abstract.
    abstract class file
    {
    ...
    public abstract string link{ get; }
    }

    其他兩個繼承於此的class做法
    class hyperfile : file
    {

    public override string link
    {
    get { return this.hyperlink; }
    }
    }

    class realfile: file
    {

    public override string link
    {
    get { return this.path; }
    }
    }




    2009年12月31日 上午 02:57
  • 謝謝programlin的回答^^

    這樣的寫法可以理解,另外想請問就是
    我現在是用vs2008 用c#寫.net系統
    如果後端用EF來接資料

    那該如何用oo的觀念把資料bind至datagrd裡呢?

    謝謝^^
    2009年12月31日 上午 03:02
  • 補貼一下目前的寫法:


     [Table]
            [InheritanceMapping(Code = "F", Type = typeof(FILE))]
            [InheritanceMapping(Code = "H", Type = typeof(HYPERFILE))]
            [InheritanceMapping(Code = "R", Type = typeof(REALFILE),
                IsDefault = true)]
            abstract class FILE
            {
                [Column(IsDiscriminator = true)]
                public int POSTID;
                [Column(IsPrimaryKey = true)]
                public int FILEID;
                [Column]
                public string FILENAME;

                public abstract string link { get; }
            }
            class Hyper : FILE
            {
                [Column]
                public int FILEID;
                [Column]
                public string HYPERLINK;

                public override string link
                {
                    get { return this.HYPERLINK ; }
                }
            }

            class Real : FILE
            {
                [Column]
                public int FILEID;
                [Column]
                public string PATH;

                public override string link
                {
                    get { return this.PATH ; }
                }
            }

    2009年12月31日 上午 03:07
  • 你這寫法應該非EF而是LINQ to SQL吧?
    LINQ to SQL繼承並不支援abstract class.

    此外建議你改用EF因為LINQ to SQL只是一個過渡時期的產品,目前應該不會再更新了.
    2009年12月31日 上午 03:17
  • 請問,那EF + LINQ to Entity
    也是有繼承的觀念嗎?就是像你寫的那樣嗎?

    我也是想用EF + LINQ to Entity來做的^^

    謝謝^^

    2009年12月31日 上午 03:26
  • 1.LINQ to Entity 就是 Entity Framework
    2.Entity Framework是微軟目前主要的ORM解決方案

    繼承當然是基本功能之一.
    後續微軟大多數的與資料存取有關的框架(WCF data service等),都是以EF為基礎.

    另外如果你要正式運用EF這類ORM solution於專案內,給個建議,如果程式設計思維無法使用OO方式撰寫,使用後弊大利,如果程式還是使用程序式方式撰寫,使用ADO.Net反而比較合適.
    因你上面的LINQ語法,很明顯的在思維上還是程序式的模式在思考,因為如果Entity Model用OO方式思考來設計,LINQ中的JOIN用到機會不大.

    • 已標示為解答 Lolota Lee 2010年1月4日 上午 05:30
    2009年12月31日 上午 03:36
  • 酷也!

    分享一個網頁:

    http://blog.roodo.com/sholfen/archives/7097013.html

    This is what i wanted!

    哈哈哈~~^^

    2009年12月31日 上午 03:45