Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果在NHibernate中混合使用受支持和不受支持的运算符,会发生什么情况?_C#_.net_Linq_Nhibernate - Fatal编程技术网

C# 如果在NHibernate中混合使用受支持和不受支持的运算符,会发生什么情况?

C# 如果在NHibernate中混合使用受支持和不受支持的运算符,会发生什么情况?,c#,.net,linq,nhibernate,C#,.net,Linq,Nhibernate,据我所知,当我使用Linq时,NHibernate支持一些操作符,并将它们转换为适当的SQL。例如,当我创建这样的查询时 q => q.Where(foo => foo.Eligibility > 0) .OrderBy(foo => foo.Eligibility); 理论上,它将在SQL中适当地执行where和order by 现在,如果我试图质疑这一点: q => q.Where(foo => foo.Eligi

据我所知,当我使用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),因为不支持运算符except

现在,如果我创建一个HashSet
blacklistedFooSet
来处理这个问题

q => q.Where(foo => foo.Eligibility > 0)
                .Where(foo=> !blacklistedFooSet.Contains(foo))
                .OrderBy(foo => foo.Eligibility);

会发生什么?NHibernate会正确翻译第一个where和orderby,然后在数据库外部手动执行另一个where吗?不受支持的运算符/子句的一般规则是什么?

LINQ语句遵循延迟执行,在枚举查询(即foreach循环)之前不会实际运行。由于您从未在所提供的代码中枚举,因此无论何时,它都会尝试将所有内容转换为SQL,从而排除NHibernateLQ中的任何错误(其中有许多错误)。NHibernate确实支持(但可能不是您的版本)。我相信它包含多达1000个左右的元素,所以它可能会工作。如果您像这样枚举查询:

q => q.Where(foo => foo.Eligibility > 0).ToList()
            .Where(foo=> !blacklistedFooSet.Contains(foo))
            .OrderBy(foo => foo.Eligibility);

然后,第二个.Where和.OrderBy将在.NET应用程序中执行。

在这种情况下,有一种方法可以找到,那就是使用类似于分析工具的分析工具来查看实际生成的SQL。这真的很容易使用,我发现它是一个必须的时候,试图找出NH Linq提供商可以做什么


另外值得一提的是,NHibernate 3.3将很快发布,其中有很多LINQ错误修复、问题和增强。如果您不能等待,那么您可以从

中提取最新的源代码,以便进行类似这样的实验,并在使用LINQ查询某些内容时了解SQL的实际情况。这是一个很好的软件,可以用SQL翻译LINQ查询,并向您展示实际发生的情况。 试试看,也许会有帮助


我查看了日志,似乎我放置的不受支持的位置在SQL中被更改为NOT(1=0)。你知道这是怎么回事吗?你用的是什么版本的NH?您是否尝试过从trunk中的最新来源获取if?