【问题标题】:Turn Function or Stored Procedure Result into "live" Result for LINQ将函数或存储过程结果转换为 LINQ 的“实时”结果
【发布时间】:2010-06-01 22:17:26
【问题描述】:

是否可以将通过存储过程或函数调用在 LINQ 中获得的结果集转换为我可以检索外键相关对象的“活动”对象集?

例如,如果我的存储过程返回一组“Contact”类型的行(= LINQ 对象),那么我似乎无法获得 Contact.BillingAddress(与外键相关)。

知道如何进行这项工作吗?

【问题讨论】:

    标签: c# sql sql-server linq stored-procedures


    【解决方案1】:

    只需将 Contacts 表和 BillingAddresses 表拖到您的 DBML 设计器中,它就可以正确导入 Contacts 和 BillingAddress 对象,包括关系(我假设您实际上已经这样做了,但我并没有提到它)。

    接下来更改 DBML 中的存储过程/函数以声明它返回联系人类型,请参阅How to: Change the Return Type of a DataContext Method (O/R Designer)。现在该过程的返回将是一个“实时”的联系人对象。

    【讨论】:

    • 如果存储过程返回的字段比原始表多(例如,在全文搜索的情况下,所有表字段+排名),这是否有效?
    • 显然不是,因为您不是返回一个联系人对象,而是一些新类型。正如 Simon 所建议的那样,您可以定义类型以使其具有必要的元数据以使其成为“实时”,但您可能会遇到 DataContext 缓存的各种问题,特别是如果您尝试对返回的对象应用更新。
    • 所以我不能只是放弃排名并将其视为联系人对象的集合吗?我不确定我是否理解为什么 DC 会感到困惑 - 它仍然是同一个对象(在 Rank 下降之后),同一个 PK 和一切。
    【解决方案2】:

    您可以在 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

    【讨论】:

      【解决方案3】:

      您必须明确地建立表之间的关系。 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); }
         }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多