NHibernate.LINQ支持的运算符

时间:2010-09-23 17:37:35

标签: linq nhibernate

我正在尝试评估NHibernate.LINQ 1.0而不实际编写任何代码。 Ayende已经承认this version of LINQ support is subpar compared to EF,但对于我的生活,我似乎无法找到一个页面来解释这个实现中支持和不支持的内容。例如,我可以使用Skip& Take?我不能用什么?

3 个答案:

答案 0 :(得分:18)

您可以查看LINQ for NHibernate示例,了解Ayende自己完成的测试,了解已实施的内容以及针对此提供商的内容。

其中一些通常支持:

  • 匿名类型创建。 new { Person = x.Name }
  • 首先()。 query.First()
  • FirstOrDefault()。 query.FirstOrDefault()
  • 单()。 query.Single()
  • 的SingleOrDefault()。 query.SingleOrDefault()
  • 骨料()。 query.Aggregate((x1,x2) => x1)
  • Contains(). query.Where(x => x.Name.Contains("Foo"))
  • StartsWith().
  • EndsWith().
  • Substring(). where db.Methods.Substring(e.FirstName, 1, 2) == "An"
  • Sub-queries. query.Where(x => x.Company.Id == 4)
  • Count(). query.Where(x => x.Relatives.Count > 0)
  • Any(). query.Any()
  • Take(). query.Take(10)
  • Skip(). query.Take(10).Skip(4)
  • OrderBy(). orderby x.Name descending
  • Replace(). AfterMethod = e.FirstName.Replace("An", "Zan"),
  • CharIndex(). where db.Methods.CharIndex(e.FirstName, 'A') == 1
  • IndexOf(). where e.FirstName.IndexOf("An") == 1
query.Where(x => x.Name.Contains("Foo"))
where db.Methods.Substring(e.FirstName, 1, 2) == "An" 

如果您的生产应用程序正在使用最新的稳定版本2.1.2.4,那么您仍然坚持NHibernate.Linq提供商提供给我们的东西,直到NHibernate 3.0(主干)获得稳定版本并且我们感觉足够安全在主要应用程序中使用它。在此之前,我对NHibernate.Linq和HQL的混合物非常满意。

答案 1 :(得分:3)

NHibernate是否可以使用Linq语句的基本测试是,您是否可以序列化该语句的表达式树,然后在不同的进程中对其进行反序列化并获得正确的答案。这意味着没有外部封闭; lambda必须只与它创建的内容一起工作或作为参数给出。

Linq2NH 1.0,IIRC,在使用未映射的类成员时也会出现阻塞,因此,例如,如果您具有只读计算属性(如特殊加权或滚动平均值),则必须将其映射到数据库列,以便在lambda中引用它(或重新创建lambda中的逻辑)。这是因为表达式树最终将被归结为SQL(通过NH的中间体之一;在2.x中它是ICriteria,在3.x中它是HQL)并且如果NH不能采用表达式并将其1:1转换为SQL将成功评估的表达式,它不会起作用。

有一个特例:Linq2NH,IIRC,足够聪明,可以将IList.Contains()表达式转换为IN子句。该列表必须在lambda中定义(如new[]{"1","2"}.Contains(m.ID))。

答案 2 :(得分:3)

Ayende的博客文章是从今年5月开始的。很多事情发生了变化。 NHiberante。由于NHibernate Trunk中新的linq提供程序,Linq 1.0 linq提供程序大约一年后被弃用。新的linq提供程序尚未完全完成,但已经非常完整,可用于远旧的linq提供程序。对新的linq提供程序不起作用的东西被认为是错误,并且会在报告的某一天得到解决。

您可以使用skip和take旧的和新的linq提供程序。可以在NHibernate Jira找到当前已知问题的列表。其他问题未知,所有其他功能都已得到支持。