【问题标题】:LINQ query does not work without .ToList()没有 .ToList() LINQ 查询不起作用
【发布时间】:2010-10-12 18:09:48
【问题描述】:

考虑以下 LINQ-to-NHibernate 查询:

var q1 = from se in query.ToList<SomeEntity>()
  where
  prop1 == "abc"
  select se;

var q2 = from se in q1
  where 
  m1(se.prop2) == "def"
  select  se;

q2 将无法使用错误:“方法 m1 未实现”。但是当用以下查询替换 q2 时,一切正常:

var q2 = from se in q1.ToList<SomeEntity>()
  where 
  m1(se.prop2) == "def"
  select  se;

为什么会这样?我怎样才能让第一个查询也起作用?这是只发生在 LINQ-to-NHibernate 中还是发生在所有 LINQ 查询中?

【问题讨论】:

    标签: linq nhibernate linq-to-nhibernate


    【解决方案1】:

    因为 LINQ 提供程序无法将方法 m1 转换为兼容的 SQL 语句。

    通过调用ToList&lt;SomeEntity&gt;(),您将整个内容读入内存,然后使用 LINQ to Objects 进行过滤(由于在这种情况下查询不会转换为 SQL,因此运行查询没有问题)。

    不幸的是,没有简单的方法让您的第一个查询工作。如果您确实需要使用m1 过滤结果,则必须先将内容读入内存。

    这也不仅仅是 LINQ to nHibernate 的限制。这将在 LINQ 提供程序使用表达式树将您的代码转换为另一种语言的任何情况下发生(在这种情况下,它试图将您的 C# 代码转换为 SQL 语句,这与 LINQ to SQL 和实体框架所做的事情相同)。

    【讨论】:

    • 这是正确的。但是,NHibernate 3确实允许您扩展 LINQ 提供程序以支持任何方法调用(当然,您必须知道如何从中创建 HQL 树)。见fabiomaulo.blogspot.com/2010/07/…
    • @Diego Mijelshon:NHibernate 3 中的惊人功能,非常感谢您的告知。
    【解决方案2】:

    大概m1 方法没有对 SQL 的转换(至少,NHibernate LINQ 提供程序无法弄清楚如何)。当您没有ToList 时,NHibernate 正试图弄清楚如何将m1 转换为SQL。当您执行ToList 时,NHibernate 不再发挥作用,它的 LINQ-to-Objects 可以处理查询。这是特定于启用 LINQ 的 ORM; LINQ-to-SQL 和 EF 将遭受类似的命运。

    【讨论】:

      【解决方案3】:

      我会说您的原始 q2 查询正在被转换为表达式树,然后当 NHibernate 尝试解析它时,它发现该方法不是其实现的一部分。首先使用 ToList() 将查询转换为集合使用可以支持 m1 方法的 List 的 LINQ 功能。

      【讨论】:

        【解决方案4】:

        我不知道 NHibernate,但这会起作用吗?

        var q2 = q1.where (x => m1(x.prop2) == "def");
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-04-01
          • 1970-01-01
          • 2016-01-20
          • 1970-01-01
          相关资源
          最近更新 更多