none
Linq To Entity 傳送型態 RRS feed

  • 問題

  • 在Linq To SQL 時大部份都使用table型態回傳資料,但在Linq To Entity時似乎沒辦法,請問該用何種型態回傳?

    說明:

    'Linq To SQL:(如紅字)

    Public Function GetTable () as Table(of TableName)

        Dim qry = from c in context.TableName select c

        return qry  

    End Function

    '----------------------------------------------------------------------------------------------

    'Linq To Entity:

    Public Function GetTable () as ?????

        Dim qry = from c in context.TableName select c

        return qry  

    End Function

     

    *試過 object 可以,但到WCF層時則產生錯誤。

    2008年11月1日 上午 02:51

解答

  • EF用LINQ產生的範例大多都是用類似以下語法

    var q = from c in ....

    產生的q為IQuerible<Type>型別,而IQuerible<Type>只是一個類似SQL Command要送給EF來執行,所以它實際上還未與實體資料庫作互動.

    而當後續語法才會開始互動

    var q = from c in ....

    froeach(var item in q) // <<這邊開始

    {

    ...

    }

    所以你的範例中應該回傳的要是一個實體資料可以如下處理

    // C#

    List<Customer> GetSource()

    {

    var q = from c in cntext.Customers

    return q.ToList();

    }

     

    ToList()為一個extend method,可以將IQuerible<Type>轉換為真正型別的List集合.

    注意一點EF設計工具產生的Code皆為強型別,而且可序列化.

    故你可以回傳這些資料操作當然也可WebService來傳遞

     

    這邊另外提供一個新技術ADO.Net Data Service.

    此技術目前在Beta階段,

    它的目的很單純就是如果當你的程式分為Client/Server (譬如說Silverlight..),Client端可以用如LINQ語法傳遞到Server端透過Data Service來存取資料,就像是在Client端一樣,與一般模式不同的是它是透過一層中間層(WCF)所以有以下好處.

    1.不需要直接對資料庫

    2.可透過如HTTP,跨Firewall.

     

    能做到此點的原因就是EF設計之初就是希望能突破現有ORM產品的一些概念,未來應該還會出現如SQL Reporting中可已下達LINQ指令透過EF存取資料庫.此外下一版SQL很有可能直接支援LINQ語法,目前因透過LINQ to SQL或EF來產生對應SQL語法因考量通用性會產生效能問題,此點未來若SQL能直接支援LINQ將會有很大突破.

    (如果能做到,期待已久的物件導向資料庫這門技術將會跨出一大步).

     

    2008年11月3日 上午 03:00

所有回覆

  • 總算有人跟有研究同一種技術.

    雖然我不知道他怎麼做.

    我的作法是將Domain Know 轉成 SQL Server 裡的'Table 及關聯.做資料存放層.

    然後寫SP 做資料邏輯層.

    然後用EntityFramework 將 Table 轉成 EDM 做成企業物件層

    用ADO.NET DataService 去做成資料服務層.

    然後產生 DataClient 層(將 DataService 轉成Proxy),用繼承及部分類別功能擴充原Data Service 原有的功能,供Client 使用.

    然後寫呈現羅輯層(Code hide file),操作DataCleint的新/刪/修.....及一些Client的狀態.

    然後用WPF的XMAL 將UI呈現.

     

    我是不知道妳中間這幾層怎麼做.

    如果你是用工具直接將Table模型轉成OR模型是可以直接使用,當然也會產生一些Source Code 你就可以知道是什麼型態的.

    但有幾點要注意的:

    1.這些Source Code 坦白說意義不大,因為這些檔要配合連工具產生出的一些XML在Run Time 時會編輯成一個可真正執行的Class,所以就算你自己寫Source Code 也不一定能用.但你可以去看Source Code 看人家產生的Code 架構多漂亮.

    2.坦白說我不知它產生的是什麼型態的物件,你所組成的是CommandTree的命令,他會在執行產生你要的結果,可能是Entity也可能是Var 的型態

    3.你這一題我記得是IQuerible<Type>的型態,這是什麼型態?我知道如果用Http協定傳輸會產生XML 的文字檔.

     

    2008年11月1日 上午 07:29
  •  GP啵兒棒 寫信:

    在Linq To SQL 時大部份都使用table型態回傳資料,但在Linq To Entity時似乎沒辦法,請問該用何種型態回傳?

    說明:

    'Linq To SQL:(如紅字)

    Public Function GetTable () as Table(of TableName)

        Dim qry = from c in context.TableName select c

        return qry  

    End Function

    '----------------------------------------------------------------------------------------------

    'Linq To Entity:

    Public Function GetTable () as ?????

        Dim qry = from c in context.TableName select c

        return qry  

    End Function

     

    *試過 object 可以,但到WCF層時則產生錯誤。

     

    最好是另設一個資料類別 (使用資料合約),再用它來在 WCF 上使用。

    LINQ to Entities 傳回的會是 IQueryable<T>,這個型別和你在 LINQ to SQL 中使用的 Table<TEntity> 都是無法序列化,所以都不能用在 WCF 中。

    2008年11月1日 上午 11:16
    版主
  • /// <summary>
            /// There are no comments for Security_Membership in the schema.
            /// </summary>
            [global:Tongue Tiedystem.Data.Objects.DataClasses.EdmRelationshipNavigationPropertyAttribute("YSERPModel", "FK_Accounting_AccountDoc_Security_Membership", "Security_Membership")]
            [global:Tongue Tiedystem.Xml.Serialization.XmlIgnoreAttribute()]
            [global:Tongue Tiedystem.Xml.Serialization.SoapIgnoreAttribute()]
            [global:Tongue Tiedystem.Runtime.Serialization.DataMemberAttribute()]
            public Security_Membership Security_Membership
            {
                get
                {
                    return ((global:Tongue Tiedystem.Data.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedReference<Security_Membership>("YSERPModel.FK_Accounting_AccountDoc_Security_Membership", "Security_Membership").Value;
                }
                set
                {
                    ((global:Tongue Tiedystem.Data.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedReference<Security_Membership>("YSERPModel.FK_Accounting_AccountDoc_Security_Membership", "Security_Membership").Value = value;
                }
            }

     

    這是我的程式抓下來的片段,這是由EDM Tool 將我的Table 轉過來的.它每一個Class,每一個Class Member 都有相關序列的Attribute 所以是可序列的.

    2008年11月3日 上午 01:19
  • EF用LINQ產生的範例大多都是用類似以下語法

    var q = from c in ....

    產生的q為IQuerible<Type>型別,而IQuerible<Type>只是一個類似SQL Command要送給EF來執行,所以它實際上還未與實體資料庫作互動.

    而當後續語法才會開始互動

    var q = from c in ....

    froeach(var item in q) // <<這邊開始

    {

    ...

    }

    所以你的範例中應該回傳的要是一個實體資料可以如下處理

    // C#

    List<Customer> GetSource()

    {

    var q = from c in cntext.Customers

    return q.ToList();

    }

     

    ToList()為一個extend method,可以將IQuerible<Type>轉換為真正型別的List集合.

    注意一點EF設計工具產生的Code皆為強型別,而且可序列化.

    故你可以回傳這些資料操作當然也可WebService來傳遞

     

    這邊另外提供一個新技術ADO.Net Data Service.

    此技術目前在Beta階段,

    它的目的很單純就是如果當你的程式分為Client/Server (譬如說Silverlight..),Client端可以用如LINQ語法傳遞到Server端透過Data Service來存取資料,就像是在Client端一樣,與一般模式不同的是它是透過一層中間層(WCF)所以有以下好處.

    1.不需要直接對資料庫

    2.可透過如HTTP,跨Firewall.

     

    能做到此點的原因就是EF設計之初就是希望能突破現有ORM產品的一些概念,未來應該還會出現如SQL Reporting中可已下達LINQ指令透過EF存取資料庫.此外下一版SQL很有可能直接支援LINQ語法,目前因透過LINQ to SQL或EF來產生對應SQL語法因考量通用性會產生效能問題,此點未來若SQL能直接支援LINQ將會有很大突破.

    (如果能做到,期待已久的物件導向資料庫這門技術將會跨出一大步).

     

    2008年11月3日 上午 03:00
  • 幾點提供參考:

    1.ADO.Net Data Service 已經是 CTP了.

    2.建議你用ADO.Net Data Service去做Web Service.因為你自己寫,如

    List<Customer> GetSource()

    {

    var q = from c in cntext.Customers

    return q.ToList();

    }

    他只有單向查詢的功能,你要更新回去資料來源還是一大議題.另外還有Dettach,Attach....很多的問題.

     

    3.2008 SSRS 好像可以用 ADO.NET 的 Provider 做資料來源,而EF 就繼承ADO.NET 的DataProvider 所以,總之,我有時間的話,可以來玩一下.

    2008年11月3日 上午 03:14
  •  好說 寫信:
    /// <summary>
            /// There are no comments for Security_Membership in the schema.
            /// </summary>
            [global:ystem.Data.Objects.DataClasses.EdmRelationshipNavigationPropertyAttribute("YSERPModel", "FK_Accounting_AccountDoc_Security_Membership", "Security_Membership")]
            [global:ystem.Xml.Serialization.XmlIgnoreAttribute()]
            [global:ystem.Xml.Serialization.SoapIgnoreAttribute()]

            [global:ystem.Runtime.Serialization.DataMemberAttribute()]
            public Security_Membership Security_Membership
            {

                  ....

            }

     

    這是我的程式抓下來的片段,這是由EDM Tool 將我的Table 轉過來的.它每一個Class,每一個Class Member 都有相關序列的Attribute 所以是可序列的.

     

    XmlIgnoreAttribute 是不要序列化公用欄位或公用讀取/寫入屬性值

    SoapIgnoreAttribute 是不要將公用欄位或公用讀取/寫入屬性值序列化

     

    如果 Entity 本身就可以序列化,那還要 ADO.NET Data Service 做什麼?

    還有,ADO.NET Data Service 早已 RTM,不是 CTP。

    2008年11月3日 上午 03:31
    版主
  • 1.沒注意到....

    2.的確這種作法只能單向,所以才會有ADO.Net Data Service出現,讓這種跨中間層的模型簡單化就像在Client端操作.

    (只是對於某些開發者而言不認同Data部分透通到UI-Layer(我也是其中之一),所以如果有注意看EF的Context與LINQ to SQL名字有個很大的差異EF叫ObjectContext非DataContext,但明明與LINQ to SQL作的事情類似還故意如此命名.

    我對於EF有相當大的興趣,目前大多數時間都在將原來NHibernate架構的系統改用EF,原因很多,最大的因素就是EF能夠透過LINQ於UI Layer的彈性.只是現階段的EF設計工具實在難用,大多數EDM檔都是手工處理相對應的Entity Class也是,也因此對於EF內部運作也有些心得,

    目前對於EF最大的感想是這項產品如果程式本身並非用分層式架構撰寫的,可以改用LINQ to SQL比較適當,這項產品的定義比較趨近於目前的ORM產品,不像是一般快速開發工具.所以也導致EF v1雖已完成,但EDMTools尚不完整就先推出,不過深入了解就能發現大多數的工作都能靠人工來達成,EF的彈性相當大(大多數NHibernate的重要特性都有),預留的架構也相當完整,很期待VS 2010,donet 4,EF v2的出現.

     

    3.SSRS 2008最近工作需求有再進行,有機會可以討論,我認為SSRS 2008比之前版本最大的進步就是目前大多數操控都能透過WebService API來控制,大多數工作都能整合到自己的程式中,不像之前版本.這也是我之前的程式都捨SSRS就CR.目前才開始投入SSRS(但要換SQL...又是一筆不小的投資,當然SSRS只是其中之一的原因SSIS才是我首要的).

     

     

    2008年11月3日 上午 03:33
  • 小朱提到的問題我沒注意到,忘了說明

     

    * to N下由於本身EF(ORM)的Lazy Loading機制並不會立即載入(考慮效能),所以若事先未將其載入,雖可以透過Web Service傳遞但存取時會是Null或空List.但對於一般內建資料型態的屬性是正常的,

    所以ADO.Net Data Service出現,他的Client Proxy物件可以傳遞如IQuerable並非實體資料的命令,但又可以真正在適當時機回傳資料,所以ADO.Net Data Service才是真正解決此類問題的解決方式.

     

    這也是EF要突破目前ORM的一些問題.

    試想一個狀況如果今天所傳遞的為一個客戶資料,其中有個屬性為訂單資料

    以物件的寫法當然希望在Client能夠如此操作

    XXXWebService service = ...//

    Customer cus = service.GetCustomer(....//

     

    foreach(Order o in cus.Orders)

    {

    ...

    }

     

    如果依ORM,必須再回傳時就先將Orders載入,並傳遞,問題是如果今天資料量很大或是Customer有相當多類似的集合屬性那是否都應該先載入?或是載入必要部分?問題是無法預測使用端會用到哪些資料.

    所以以往都會將這部分改為

    XXXWebService service = ...//

    Customer cus = service.GetCustomer(....//

     

    foreahc(Order o in service.GetOrersByCustomerId(cus.Id)

    {

    }

     

    將Orders屬性標記為不公開,透過另一個WebService來取得.

     

    但如果用了ADO.Net Dat Service就不用這麼麻煩.

    因為傳遞的是指令.所以真正再取得資料時才會回傳必要的資料

    就如同EF

    var q = from ...

    foreach(Customer c in q) //此時才透過ADO.Net Data Service傳遞Command取得資料

    {

    c.Orders //需要Orders才會再透過ADO.Net Data Service取得,故Orders屬性並不是一個實體資料而是一個Proxy物件.

    }

     

     

     

     

     

     

     

     

     

    2008年11月3日 上午 03:52
  • Linq To SQL 跟 ADO.NET Data Service有幾個不同

    ADO.NET Data Service 可以控制 某 Entity 要不要 Update

    ADO.NET Data Service 可以控制Entity 的讀取時間及Object Graphic 的範圍,大小

    ADO.NET Data Service 實作了Attath及Dettach.

    所以要用Orders時

    Entities.LoadProperty(cust1,"Orders");

     

     

     

    2008年11月3日 上午 04:01
  • 我只是要提醒不要看到影子就開槍 ...

    看到 System.Runtime.Serialization 就說它可以序列化,要看完整一點。

     

    ADO.NET Data Service 在開放 Entity Data Model 在 Web 上確實是好物,只是還有不少改進空間,像是隨選資料(Data On Demand)這種會和使用者帳戶綁在一起的 Entity 要怎麼過濾,是否有開放 UserName/Password 等,也許有,但在 ADO.NET Data Service 的文件中並沒有提到,可能要利用 WCF 的基礎來做。

     

    2008年11月3日 上午 04:03
    版主
  • Lazy Loading問題

    實際上是因為EF至目前為止認為Load的時機應該由User決定,但很多人不認同,不過EF要解決自動載入的問題並不難,在美國EF論壇,有提到EF v2將有可能支援自動載入,目前也有人針對EF v1寫了class處理.我目前專案也是使用此 class).或式很簡的將Collection屬性改寫用IsLoad判斷即可(當然還要考慮依些Attath問題).

    而Ado.Net DataService也應該是如此,要做到動態載入也應該不難

    Ado.Net DataService目前尚未深入研究改天來試看看.

     

    ....

    最近一堆新技術趕著出現...時間不夠啦~!!

     

    2008年11月3日 上午 04:08
  • XmlIgnoreAttribute 是不要序列化公用欄位或公用讀取/寫入屬性值

    SoapIgnoreAttribute 是不要將公用欄位或公用讀取/寫入屬性值序列化

    沒有序列化的問題!加上面的Attribute幹碼? 是太閒嗎?

    明明就可以,文件上也有,你們可以去研究.

    ADO.NET DataService 是讓你有另一種方式,更快速的開發.

    ADO.NET DataSerice 是建構在 EF 之上,如果EF不能序列化!

    ADO.NET DataSerice 怎麼去用 EDM...產生出來的東西?

     

     

    2008年11月3日 上午 05:07
  • 那兩個可是由你貼的程式找到的,不是我太閒,不信自己去看。

    如果它可以序列化,那為什麼 WCF 會丟不出去 (最原始的問題)?

     

    ADO.NET Data Service 我已經玩過了,早在去年他還在 CTP/Beta 1 時就已經講過了,不然怎麼會在上面講的出它可能欠缺的一堆東西?

     

    Entity Data Model 就是因為不能序列化才會有 Data Service 這個東西(不然 Data Service 根本不用玩了),Data Service 是一個掛在 WCF 上的轉換層(Entity Data Model 的用戶端,以及前端查詢的伺服端),可以接受到自用戶端的 HTTP 查詢字串,再把 Entity 中的資料轉換成 ATOM 或 JSON 回傳,不是整個 Entity 回傳,這點請先搞清楚。

    2008年11月3日 上午 05:21
    版主
  • 那二行是我程式裡找到的沒錯!那只是我隨便剪下來的,全部貼上來大家不是都睡著了.

    它可以序列化,文件裡有說明.本來我的做法跟另外一位仁兄一樣,所以我文件有喵到那裡.因為我有發現更快速的方式,所以文件我就沒繼續看下去.

    不管ATOM,JSON 這些都是XML 序列化的結果,序列化是有很多格式的,不是嗎!

    你去用瀏覽器,輸入位址,參數,它出現的結果不是跟WCF產生的差不多.

     

     

     

    2008年11月3日 上午 05:36
  •  

    感謝各位的幫忙,問題是出在如 小朱好說 所說的(object)序列化的問題。

    已改為 programlin 所說的 toList 方式傳資料,

    但..回傳資料方面該用何種型態?

    如:

    ' ui層(WinFrom vb.net,不是WPF)

    Code Snippet

      Dim qry = From c in Custmer _

                     Where c.Name = "Allen" _

                     Select c   '取出資料allen所有資料

     

     

    取出後該如何修改資料再傳回資料?資料型態?

    (抱歉小弟初碰 EF ,所找到的範例也不多,所以問題較多)

     


     

    2008年11月4日 上午 03:49
  •  GP啵兒棒 寫信:

     

    感謝各位的幫忙,問題是出在如 小朱好說 所說的(object)序列化的問題。

    已改為 programlin 所說的 toList 方式傳資料,

    但..回傳資料方面該用何種型態?

    如:

    ' ui層(WinFrom vb.net,不是WPF)

    Code Snippet

      Dim qry = From c in Custmer _

                     Where c.Name = "Allen" _

                     Select c   '取出資料allen所有資料

     

     

    取出後該如何修改資料再傳回資料?資料型態?

    (抱歉小弟初碰 EF ,所找到的範例也不多,所以問題較多)

     

    ToList()回傳的是一個泛型的集合型別 List<T>

    如果沒用過泛型這項技術建議你可以先了解一下.

     

    學習LINQ有幾樣東西必須先了解

    1.泛型設計

    2.委派

    3.匿名函式

    4.匿名型別

    5.Lamda表示式.

     

    前三項是dotnet 2.0舊有的技術,後兩項是為了LINQ產生的新技術,但這些技術都有很多關連,最好先了解過才會知道來龍去脈.

    建議你參考一本書 Microsfot Press出版的Programing Microsoft LINQ這本有中文版最前面那章說明了LINQ精華.而這本書也是我看過目前針對LINQ琢磨層度最深的書籍,但就LINQ部分比起黃忠成大哥的那本更深入(黃大哥對不起....但LINQ to SQL與ADO.Net Entity Framework你的比較好).

    而至於ADO.Net Entity framework當然中文書還是首推黃大哥的那本極易之道..

    2008年11月14日 上午 08:47