考虑以下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查询中都会发生?
发布于 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做的事情是一样的),都会发生这种情况。
发布于 2010-10-13 02:12:15
假设方法m1不具有到NHibernate的转换(至少,SQL提供程序不知道如何进行转换)。当您没有ToList时,NHibernate会尝试找出如何将m1转换为SQL。当您执行ToList时,NHibernate不再扮演一个角色,它的LINQ对象可以处理查询。这是特定于启用LINQ的ORM的;LINQ- to -SQL和EF将遭受类似的命运。
发布于 2010-10-13 02:12:40
我要说的是,您的原始q2查询被转换为表达式树,然后当NHibernate尝试解析它时,它发现该方法不是其实现的一部分。首先使用ToList()将查询转换为集合,使用List的LINQ功能,该功能可以支持m1方法。
https://stackoverflow.com/questions/3917679
复制相似问题