【问题标题】:Most complete ORM with LINQ support?支持 LINQ 的最完整的 ORM?
【发布时间】:2009-03-01 21:54:26
【问题描述】:

我正在寻找提供完整或接近完整 LINQ 支持的 ORM。

LINQ to SQL
- 支持 LINQ 内部的所有内容(.Contains、Math.Log 等)
- 在不创建新数据上下文的情况下无法急切加载关系属性

ADO.NET 实体框架
- 糟糕的 LINQ 支持(很多缺失的功能)。
- 强大的地图功能 - 可以使用 ObjectQuery

上的 .Include 方法按需加载

光速
- 出色的 LINQ 支持缺少一些功能(.Contains 在 Where 中)
- 生成的一些 SQL 效率很低。

这些似乎都不是完美的,我真的希望我能从每一个中提取点点滴滴。我个人非常喜欢 ADO.NET EF,除了它缺少的功能让它使用起来令人沮丧。

我知道有些人对 NHibernate 赞不绝口,我并没有反对它,但我今天花了很多时间尝试它,没关系,但它的 LINQ 支持不是很好。

【问题讨论】:

  • 只是好奇...为什么 LINQ 对您访问数据库如此重要?
  • 为什么说 LINQ 对 EF 的支持很糟糕? EF4 中缺少哪些功能?

标签: sql linq-to-sql orm


【解决方案1】:

试试 DataObjects.NET。 我是 DO 开发人员之一。我在该项目中的最新活动是为 DataObjects 实现 LINQ。所以我可以简单描述一下:

  • 支持几乎所有 LINQ 方法,除了 Last/LastOrDefault/Aggregate/Reverse/TakeWhile/SkipWhile 等以及具有 .NET 特定参数的方法 - 例如 IComparer(没有人支持它们)。
  • 支持几乎所有字符串和数学方法(并且您可以编写自己的函数映射!)。
  • GroupBy\SelectMany\Contains\Single\etc 的复杂场景。支持 in 子查询和相关子查询。

我们有大约 1000 次 LINQ 实现测试,其中 99% 都通过了。所以我可以说当前的实现接近 EF。有些方法不适用于 EF,有些方法不适用于我们的框架。 检查此简短描述http://www.x-tensive.com/Products/DO/

【讨论】:

    【解决方案2】:

    Llblgen 似乎有很好的 linq 支持。 Frans 有一系列关于他开发的博客文章http://weblogs.asp.net/fbouma/archive/2007/09/11/developing-linq-to-llblgen-pro-day-0.aspx

    【讨论】:

      【解决方案3】:

      【讨论】:

        【解决方案4】:

        DataObjects.Net 具有近乎完整的 LINQ 支持。

        【讨论】:

        • DataObjects 存在严重缺陷。 NHibernate 将是一个更好的解决方案,并且具有更好的 LINQ 支持。
        • 任何参数\事实\测试链接?
        【解决方案5】:

        SubSonic 的最新版本 3.0 已围绕 Linq 的使用完全重写 - http://subsonicproject.com/docs/3.0_Summary

        【讨论】:

          【解决方案6】:

          NHibernate 与 Linq 到 NHibernate

          【讨论】:

          • 嗨,Alex,感谢您提供的信息 - 尽管我必须告诉您,我所看到的只是:NHibernate 对我的目的来说已经足够快了。 ;)
          • 性能测试总是主观的。但正如我后来发现的那样,“近乎完整的 LINQ 支持”也不是关于 NHibernate 的说法,而且主观性要小得多:ormbattle.net
          • 更多战斗 FUD?可耻。
          • 不提供事实/参考资料并混淆用户真是可耻。我也可以说“哇哦,又一个 NH 粉丝来了”——结果相同。所以最好是看到至少 一些 测试显示 NH 支持 LINQ 中的 X、Y 和 Z 功能,但其他人只支持 X 和 Y。但是没有这样的测试 - 此外,目前 NH没有一个表格清楚地说明什么是支持的,什么是不支持的(例如:goo.gl/HjW0)。
          【解决方案7】:

          我对 EF 也有同样的问题。我想将它用于映射,但由于缺乏良好的 linq 支持而放弃了它。

          我不确定您所说的预加载关系属性是什么意思,但您可以使用普通的 linq-2-sql 预加载。

          你使用LoadOptions.LoadWith<T>(expression).

          【讨论】:

          • 对,但我想在查询级别进行。我可能想为一个查询而不是另一个查询 x 关系。但我不想为了查询一次而创建一个新的数据上下文。
          【解决方案8】:

          Signum Framework 有一个 linq 提供程序,http://www.signumframework.com/DatabaseQuery.ashx,并且有一个完全不同的加载实体的方式。没有数据上下文。

          它只适用于新应用程序。

          【讨论】:

            【解决方案9】:

            Genome.

            Genome O/RM 使用 LINQ 生成数据访问层,将 Microsoft SQL Server、Oracle 和 IBM DB2 等关系数据库系统连接到您的 .NET 企业应用程序。

            【讨论】:

              【解决方案10】:

              EntityFramework 5.0 刚刚好,虽然它与 nhibernate 相比缺少一些功能,但在 LINQ 支持方面它非常完整,比 nhibernate 好得多。 Nhibernate 有 SessionFactory 和 Session 的概念,而 entityframework 有 DbContext 的概念,它类似于 nhibernate 的会话,但更容易设置和管理,您可以连接到许多数据库,您只需要为每个数据库定义一个 DbContext 和实例化 SpecificDbContext 以便针对特定 DB 开始和编写 LINQ 查询。

              【讨论】:

                猜你喜欢
                • 2014-01-18
                • 2011-04-30
                • 1970-01-01
                • 1970-01-01
                • 2021-02-06
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多