我正在尝试评估NHibernate.LINQ 1.0而不实际编写任何代码。 Ayende已经承认this version of LINQ support is subpar compared to EF,但对于我的生活,我似乎无法找到一个页面来解释这个实现中支持和不支持的内容。例如,我可以使用Skip
& Take
?我不能用什么?
答案 0 :(得分:18)
您可以查看LINQ for NHibernate示例,了解Ayende自己完成的测试,了解已实施的内容以及针对此提供商的内容。
其中一些通常支持:
new { Person = x.Name }
query.First()
query.FirstOrDefault()
query.Single()
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找到当前已知问题的列表。其他问题未知,所有其他功能都已得到支持。