2010-06-01 67 views
2

是否可以將通過存儲過程或函數調用在LINQ中獲得的結果集轉換爲可以檢索外鍵相關對象的「活」對象集合?將函數或存儲過程結果轉換爲「實時」LINQ結果

例如,如果我的存儲過程返回一組類型爲「Contact」的行(= LINQ對象),那麼我似乎無法獲得Contact.BillingAddress(與外鍵相關)。

任何想法如何使這項工作?

回答

0

您可以通過將存儲過程從服務器資源管理器拖動到位於對象窗格右側的「方法」窗格,在Linq to SQL設計器中執行此操作。

然後,你將在你的datacontext上有一個方法返回一個ISingleResult類型。您可以選擇重寫此方法以映射到您希望的模型中的任何類型。

這裏有幾個資源用於幫助: http://social.msdn.microsoft.com/forums/en-US/linqprojectgeneral/thread/1667a989-08a0-402c-9358-e4637406a75f/

http://davidhayden.com/blog/dave/archive/2007/08/07/CreatingDataAccessLayerLINQToSQLStoredProceduresSupport.aspx

0

你必須明確地建立表之間的關係。在LINQ to SQL設計也許能夠做到這一點,但我更喜歡寫代碼,像這樣:

[Table(Name="Contact")] 
public class Contact 
{ 
    [Column(Id=true)] 
    public int ContactID; 
    [Column] 
    public string BillingAddressID; 
    private EntityRef<BillingAddress> _BillingAddress;  
    [Association(Storage="_BillingAddress", ThisKey="BillingAddressID")] 
    public BillingAddress BillingAddress { 
     get { return this._BillingAddress.Entity; } 
     set { this._BillingAddress.Entity = value; } 
    } 
} 

[Table(Name="BillingAddress")] 
public class BillingAddress 
{ 
    [Column(Id=true)] 
    public string BillingAddressID; 
    ... 
    private EntitySet<Contact> _Contacts; 
    [Association(Storage="_Contacts", OtherKey="BillingAddressID")] 
    public EntitySet<Contact> Contacts { 
     get { return this._Contacts; } 
     set { this._Contacts.Assign(value); } 
    } 
} 
1

只需拖動聯繫人表和BillingAddresses表到您的DBML設計師,所以它導入聯繫人和BillingAddress包括關係在內的對象(我認爲你實際上已經做到了這一點,但我提到它不是那麼簡單)。

接下來更改DBML中的存儲過程/函數以聲明它返回聯繫人類型,請參閱How to: Change the Return Type of a DataContext Method (O/R Designer)。現在,該過程的返回將是一個「實時」聯繫人對象。

+0

如果存儲過程比原始表返回更多字段(例如,在全文搜索的情況下所有表字段+排名),這是否甚至可以工作? – Alex 2010-06-02 01:18:06

+0

顯然不是,因爲你*不是*返回一個Contacts對象,而是一些新的類型。正如Simon所建議的那樣,您*可能會*定義類型以使其具有所需的元數據,使其成爲「實時」類型,但您可能遇到DataContext緩存的各種問題,特別是如果您嘗試將更新應用於對象返回。 – 2010-06-02 01:31:56

+0

所以我不能只放棄Rank並將它視爲Contacts對象的集合?我不確定我是否理解DC爲什麼會感到困惑 - 它仍然是同一個對象(排名下降後),相同的PK和所有內容。 – Alex 2010-06-02 04:03:44