【问题标题】:Implement LINQ to SQL/Entity like behavior in custom object在自定义对象中实现 LINQ to SQL/Entity 类行为
【发布时间】:2023-03-22 13:39:02
【问题描述】:

我很好奇 Enity Framework 究竟如何与 LINQ 集成以生成 SQL 语句以针对数据库运行。

假设我有自己的自定义集合对象。如何将该对象与 LINQ 集成以生成 SQL 语句?

【问题讨论】:

  • 这是一个相当广泛的问题。你能说得更具体点吗?
  • @Justin,只是答案可能是一个非常深奥的主题。我对接口的实现了解不多,所以我无法真正提出具体的问题。我或多或少只是在寻找您从哪里开始执行此类任务。

标签: .net linq


【解决方案1】:

为了帮助有类似要求的任何人,我编写了一系列教程,介绍如何创建简单的 LINQ 提供程序、解析表达式树、将它们转换为所需的输出(例如 SQL)并进行编译。在为生产系统开发了一个这样的提供程序之后,我最终认为这种经验可能会对其他人有所帮助,但挑战在于找到时间将其写成文字。过去,我从其他人分享他们的知识中受益匪浅,尤其是在缺乏知识的主题上,所以,希望这也能找到观众:

【讨论】:

    【解决方案2】:

    您必须在您的自定义类上实现某些接口(例如 IQueryable)才能使用 Linq 来查询它们。此外,如果你有一个组成你的类的集合,那么你可以公开它的枚举器以便在这个领域中获得收益(实现 IEnumerable)。 看: How to implement IQueryable

    如果您需要一个非常专业的“Linq”功能,例如在 Linq to SQL 中用于将 Linq 表达式转换为 T-SQL 的功能,那么 Linq 就像一个标准:不同的技术集以不同的方式实现 Linq,但有一定的指导方针。这对于 Linq to XML、Linq to Entities、Linq to SQL 等都是正确的。 见:

    Walkthrough: Creating an IQueryable LINQ Provider

    【讨论】:

    • 我不完全明白您的意思是“为了获得 Linq 支持”。我只是想确保人们不会产生错误的印象。LINQ 代表语言集成查询,它可以直接在对象上工作,而无需装饰现有对象。
    • @Quintin - 我认为他指的是您需要实现诸如IEnumerable<T>IQueryable<T> 之类的接口才能访问大多数LINQ 扩展方法。它不一定适用于给定类的单个实例。然而,这只是 LINQ 庞大图景的一小部分。这个问题非常广泛。
    • @Quintin,贾斯汀,你们都是对的。我已经编辑了我的答案。谢谢
    【解决方案3】:

    如果您想创建自己的创建 SQL 语句的集合,那么您要做的就是让您的集合类实现 IQueryable 接口。作为此接口的一部分,当执行 Linq 表达式时,.NET 框架会将 Linq 表达式树传递给 IQueryable 的自定义实现。然后,您的代码将解析这个表达式树,并根据需要生成 SQL,或者执行任何其他需要的操作,然后返回结果。

    编辑:添加链接

    【讨论】:

    • 很好的答案,+1,但您可以通过提供一些关于进一步阅读的链接来改进它。我个人建议从 Jon Skeet 的书开始,然后继续阅读有关实现 IQueryable 的更多信息,如果您想在代码中实现它。
    • @Dmitry - 根据要求添加了链接。享受吧!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-25
    • 2011-04-27
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多