据我所知,当我使用Linq时,NHibernate支持一些运算符并将它们转换为适当的SQL。例如,当我创建这样的查询时
q => q.Where(foo => foo.Eligibility > 0)
.OrderBy(foo => foo.Eligibility);
理论上它将在SQL中适当地执行where和order by。
现在,如果我想查询这个:
q => q.Where(foo => foo.Eligibility > 0)
.Except(blacklistedFoos)
.OrderBy(foo => foo.Eligibility);
它给我一个错误(我们在生产中使用的v2.0.50727),因为不支持运算符。
现在,如果我创建一个HashSet blacklistedFooSet
来处理这个问题,
q => q.Where(foo => foo.Eligibility > 0)
.Where(foo=> !blacklistedFooSet.Contains(foo))
.OrderBy(foo => foo.Eligibility);
会发生什么? NHibernate会正确翻译第一个位置和顺序,然后在数据库外部手动执行另一个吗?不支持的operator / clause的一般规则是什么?
答案 0 :(得分:0)
LINQ语句遵循延迟执行,并且在枚举查询(即foreach循环)之前不会实际运行。由于你从不枚举你提供的代码,它会尝试将所有内容都转换为SQL,除非NHibernateLINQ中存在任何错误(其中有很多错误)。 NHibernate支持(可能不是你的版本)。我相信包含多达1000个左右的元素,所以它可能有用。如果你这样枚举你的查询:
q => q.Where(foo => foo.Eligibility > 0).ToList()
.Where(foo=> !blacklistedFooSet.Contains(foo))
.OrderBy(foo => foo.Eligibility);
然后第二个.Where和.OrderBy将在.NET应用程序中执行。
答案 1 :(得分:0)
在这种情况下,有一种方法可以找到并使用像NHProf这样的分析工具来查看生成的实际SQL。它非常容易使用,我觉得在尝试NH Linq提供商可以做的事情时我必须这样做。
另外值得一提的是NHibernate 3.3即将发布,其中包含大量LINQ错误修复,问题和增强功能。如果您不能等待,那么您可以从GitHub
中获取最新的来源答案 2 :(得分:0)
为了进行这样的实验,当我使用LINQ查询LINQPad时,了解SQL的实际情况。这是一个非常好的软件,可以在SQL中翻译您的LINQ查询,并向您展示实际发生的情况。 试试吧也许它可以提供帮助。