代码之家  ›  专栏  ›  技术社区  ›  Michael Mann

优化存储过程,使它们能够被Linq2SQL正确处理

  •  1
  • Michael Mann  · 技术社区  · 15 年前

    在我工作的地方,我们需要通过存储过程作为通过代码访问数据的机制。我正在使用LINQ2SQL来最小化这种痛苦,这样我就可以直接使用对象而不是ADO.NET。我有一种情况,Linq2SQL正在使用我的一个存储过程生成代码,其中存储过程调用的返回类型是int。存储过程实际上返回一个数据集。在做了一些研究之后,我发现这是因为SQLClient库无法正确解析存储过程以生成Linq2SQL用于创建对象图的预期元数据。我的问题是,如何构造存储过程(即使是复杂的存储过程)以便从linq2sql中获取对象图,或者换句话说,您应该避免在存储过程中包含哪些内容,这些内容会导致SQLClient库不理解如何生成linq2sql使用的元数据以创建对象图而产生混乱?

    2 回复  |  直到 15 年前
        1
  •  4
  •   DamienG    15 年前

    这实际上不是LINQ对SQL的限制,而是SQL Server的限制,当它包含临时表、游标或动态SQL时,SQL Server不能总是告诉客户机返回类型是什么,而不实际运行它。

    您可以使用设计器手动设置它,或者 完全可以 要使用无效数据运行存储过程(即,它是纯被动的),可以在存储过程的开头添加SET FMTOPT OFF。

        2
  •  1
  •   Michael Maddox    15 年前

    DamienG在微软的LinqToSql团队工作,我认为他的答案是正确的。

    也就是说,他很可能不会建议你离开LinqToSql,我认为考虑这个选项是非常重要的。

    尝试猜测存储过程的返回类型是非常困难的,LinqToSql做得和任何人一样好(对于SQL Server)。也就是说,有非常令人信服的理由不使用存储过程:

    Stored procedures are bad, m'kay?

    如果您使用的是视图,那么在ORM部门中有比LinqToSql更好的选项。

    我强烈建议不要继续沿着你现在的道路走下去。