首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LINQ查询在没有.ToList()的情况下无法工作

LINQ查询在没有.ToList()的情况下无法工作
EN

Stack Overflow用户
提问于 2010-10-13 02:09:48
回答 4查看 1.5K关注 0票数 1

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

代码语言:javascript
复制
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时,一切都正常:

代码语言:javascript
复制
var q2 = from se in q1.ToList<SomeEntity>()
  where 
  m1(se.prop2) == "def"
  select  se;

为什么会发生这种情况?我怎样才能让第一个查询也能工作?这是仅在LINQ-to-NHibernate中发生的事情,还是在所有LINQ查询中都会发生?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-10-13 02:12:22

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

通过调用ToList<SomeEntity>(),您可以将整个内容读取到内存中,然后使用LINQ对象进行过滤(由于在这种情况下查询不会转换为SQL,因此运行查询没有问题)。

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

这也不仅仅是LINQ to nHibernate的限制。在任何LINQ提供者使用表达式树将你的代码转换成另一种语言的情况下(在这种情况下,它试图将你的C#代码转换成SQL语句,这与LINQ to SQL和Entity Framework做的事情是一样的),都会发生这种情况。

票数 3
EN

Stack Overflow用户

发布于 2010-10-13 02:12:15

假设方法m1不具有到NHibernate的转换(至少,SQL提供程序不知道如何进行转换)。当您没有ToList时,NHibernate会尝试找出如何将m1转换为SQL。当您执行ToList时,NHibernate不再扮演一个角色,它的LINQ对象可以处理查询。这是特定于启用LINQ的ORM的;LINQ- to -SQL和EF将遭受类似的命运。

票数 1
EN

Stack Overflow用户

发布于 2010-10-13 02:12:40

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3917679

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档