【发布时间】:2010-06-01 22:17:26
【问题描述】:
是否可以将通过存储过程或函数调用在 LINQ 中获得的结果集转换为我可以检索外键相关对象的“活动”对象集?
例如,如果我的存储过程返回一组“Contact”类型的行(= LINQ 对象),那么我似乎无法获得 Contact.BillingAddress(与外键相关)。
知道如何进行这项工作吗?
【问题讨论】:
标签: c# sql sql-server linq stored-procedures
是否可以将通过存储过程或函数调用在 LINQ 中获得的结果集转换为我可以检索外键相关对象的“活动”对象集?
例如,如果我的存储过程返回一组“Contact”类型的行(= LINQ 对象),那么我似乎无法获得 Contact.BillingAddress(与外键相关)。
知道如何进行这项工作吗?
【问题讨论】:
标签: c# sql sql-server linq stored-procedures
只需将 Contacts 表和 BillingAddresses 表拖到您的 DBML 设计器中,它就可以正确导入 Contacts 和 BillingAddress 对象,包括关系(我假设您实际上已经这样做了,但我并没有提到它)。
接下来更改 DBML 中的存储过程/函数以声明它返回联系人类型,请参阅How to: Change the Return Type of a DataContext Method (O/R Designer)。现在该过程的返回将是一个“实时”的联系人对象。
【讨论】:
您可以在 Linq to SQL 设计器中执行此操作,方法是将存储过程从服务器资源管理器拖到对象窗格右侧的“方法”窗格。
然后,您将在 datacontext 上拥有一个返回 ISingleResult 类型的方法。您可以选择重写此方法以映射到您希望的模型中的任何类型。
【讨论】:
您必须明确地建立表之间的关系。 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); }
}
}
【讨论】: