【问题标题】:Can I extend the operators that LINQ-to-SQL supports?我可以扩展 LINQ-to-SQL 支持的运算符吗?
【发布时间】:2009-08-20 21:07:59
【问题描述】:

如果我非常想这样做,我是否可以向 LINQ-to-SQL 添加额外的 LINQ 构造(如果我创建自己的 LINQ 提供程序就可以这样做)?例如,许多内置的 LINQ 运算符 (XYZ.Any()) 会直接转换为 SQL(例如 IF EXISTS(XYZ))。

如果我需要一个专门的构造,我什至可以扩充该集合,还是必须将其纳入实际的 LINQ-to-SQL 提供程序?

我将如何添加新的运算符实现? C# 扩展方法是否足以完成这项工作?

如果答案是肯定的,那么有人愿意通过 LINQ-to-SQL 生成的动态 SQL 来替换很多(全部?)存储过程功能吗?

【问题讨论】:

    标签: c# linq linq-to-sql extension-methods


    【解决方案1】:

    理论上,您可以向 LINQ 提供程序添加对任意表达式的支持,但 Pavel 认为 LINQ to SQL 不能作为起点是正确的。我会研究 SubSonic 或 NHibernate,它们也有正在开发的 LINQ 提供程序。一旦提供程序支持表达式,您只需在 IQueryable<T> 上构建等效的扩展方法 - 反映 System.Linq.Queryable 了解详细信息。

    也就是说,解析表达式树绝对不适合胆小的人。除非您真的对 AST 理论感兴趣,否则以“正常”方式扩展 OSS ORM 可能会更容易。

    【讨论】:

    • 我非常熟悉从 AST 解析/表达式树结束时需要做的事情。我实际上还没有确切的需求,但主要是想知道未来的使用。太糟糕了,因为如果 everything 都可以在 LINQ 中表达,那将是一个非常酷的模型。现在,当您提到 SubSonic 和 NHibernate 时,是因为它们确实允许扩展,还是只是作为另一个可能拥有我需要的提供商?
    • 我不知道 SubSonic 或 NHibernate 的任何内置表达式可扩展性,但至少您可以选择下载源代码并添加自己的源代码。尽管在 LINQ 中表达 一切 很酷,但有些 SQL 构造根本无法很好地映射。这可能会随着 .NET 4 中扩展的表达式支持而改变。
    【解决方案2】:

    不,LINQ to SQL 不能像那样扩展。最好的办法就是使用存储过程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-06
      • 2012-02-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多