代码之家  ›  专栏  ›  技术社区  ›  roufamatic RichardJohnn

NHibernate.LINQ公司支持的运算符

  •  12
  • roufamatic RichardJohnn  · 技术社区  · 15 年前

    我在评估NHibernate.LINQ公司1.0而没有实际编写任何代码。艾恩德承认 this version of LINQ support is subpar compared to EF ,但就我的一生而言,似乎找不到一个页面来解释此实现中支持和不支持的内容。例如,我可以使用 Skip & Take ? 我不能用什么?

    3 回复  |  直到 15 年前
        1
  •  18
  •   rebelliard    15 年前

    LINQ for NHibernate 示例来查看由Ayende自己对这个提供者实现的和不实现的测试。

    其中一些 通常地 支持:

    • new { Person = x.Name }
    • 第一个()。 query.First()
    • FirstOrDefault()。 query.FirstOrDefault()
    • 单个()。 query.Single()
    • query.SingleOrDefault()
    • 聚合()。 query.Aggregate((x1,x2) => x1)
    • query.Where(x => x.Name.Contains("Foo"))
    • StartsWith()。
    • EndsWith()。
    • 子字符串()。 where db.Methods.Substring(e.FirstName, 1, 2) == "An"
    • 子查询。 query.Where(x => x.Company.Id == 4)
    • Count()。 query.Where(x => x.Relatives.Count > 0)
    • 任何()。 query.Any()
    • query.Take(10)
    • 跳过()。 query.Take(10).Skip(4)
    • OrderBy()。 orderby x.Name descending
    • 替换()。 AfterMethod = e.FirstName.Replace("An", "Zan"),
    • CharIndex()。 where db.Methods.CharIndex(e.FirstName, 'A') == 1
    • IndexOf()。 where e.FirstName.IndexOf("An") == 1

    有问题:

    • 连接

    我自己的一个例子:

    query = NSession.Session.Linq<Catalog>()
                .Where(acc => acc.Company.Status == "A")
            .Where(acc => acc.Id.StartsWith("12-536"))
            .Where(acc => acc.Id.EndsWith("92") || acc.Id.EndsWith("67"))
            .Take(10).OrderBy(acc => acc.Title);
    

    如果您的生产应用程序像我一样使用最新的稳定版本2.1.2.4,那么您会被林克郡在nhibernate3.0(trunk)得到一个稳定的版本之前,提供商会给我们提供帮助,我们觉得在主要应用程序上使用它足够安全。在那之前,我对混合的林克郡和HQL。

        2
  •  3
  •   KeithS    15 年前

    NHibernate是否可以处理Linq语句的基本测试是,是否可以序列化该语句的表达式树,然后在不同的进程中反序列化它并得到正确的答案。这意味着没有外部闭包;lambda必须只处理它创建的或作为参数给定的内容。

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

        3
  •  3
  •   BenMorel Manish Pradhan    12 年前

    来自Ayende的博客文章来自今年5月。很多事情都变了。 NHiberante。由于NHibernate主干中的新Linq提供程序,linq1.0linq提供程序从大约一年前就被弃用了。新的linq提供程序还没有完全完成,但是已经非常完整,并且比旧的linq提供程序可用得多。不能与新的linq提供程序一起工作的事情被认为是bug,并将在某一天报告时得到解决。

    NHibernate Jira