C# LINQ对Nhibernate性能的影响

C# LINQ对Nhibernate性能的影响,c#,linq,nhibernate,C#,Linq,Nhibernate,我正在使用NHibernate和LINQ的组合来尝试和实现查询,但我担心下面的查询会从数据库中撤回每个用户行,导致数据库延迟大、网络流量大、内存占用大,然后过滤出来太晚 public bool CheckEmailAddressIsAvailable (string emailAddress, IDataRepository repository) { var users = from user in repository.GetItems<User

我正在使用NHibernate和LINQ的组合来尝试和实现查询,但我担心下面的查询会从数据库中撤回每个用户行,导致数据库延迟大、网络流量大、内存占用大,然后过滤出来太晚

public bool CheckEmailAddressIsAvailable
               (string emailAddress, IDataRepository repository)
{
     var users = from user in repository.GetItems<User>()
                 where user.EmailAddress.Equals(
                     emailAddress,
                     System.StringComparison.CurrentCultureIgnoreCase)
                 select user;

     return !(users.Any());
}
GetItems返回什么? 如果它返回除IQueryable()之外的任何内容,那么您只是在(内存中)对对象执行LINQ。这就意味着要装上整套

您必须返回IQueryable以允许DB端筛选


检查ISession的Query()扩展方法。这将为您提供一个IQueryable

NHibernate使用log4net进行日志记录,因此如果您已经在使用它,一种方法是在
app.config
文件中将
NHibernate.SQL
日志记录程序级别设置为
DEBUG

<logger name="NHibernate.SQL">
  <level value="DEBUG"/>
</logger>

通常,与任何其他应用程序一样,您可以简单地使用SQL事件探查器和日志查询一段时间

关于LINQ代码,我很确定它创建的SQL查询与下面的类似,但是如果不看到
GetItems
代码,就很难判断


如果这感觉很慢,您可能需要在
EmailAddress
列上建立索引。SQL Profiler的好处在于,您可以在数据库引擎优化顾问中分析其日志,并获得改进建议。

我不使用NHibernate,但您可以使用SQL Profiler查看应用程序正在运行的查询。我还会尝试使用.Count!=0而不是.Any(),如果您认为没有实现1)[如何启用sql日志记录][1][1]:另外,您使用的NHibernate版本也需要注意,因为带有contrib NHibernate.Linq的v2.1很糟糕:(因此,如果您从GetItems返回IQueryable并在LINQ表达式中使用它,它将进行DB端筛选?很好!只需查看ISession,没有查询方法。这是我需要自己编写的东西吗?正如我所说,这是一个扩展方法。检查这个线程,那么您将标记放在应用程序配置中的级别是什么?我已经尝试过了。)当我添加配置时,它似乎根本无法加载配置in@user1122909:首先,您需要通过在
元素中添加
来定义此部分。然后,您需要添加
部分,在其中定义日志附加器(文件、电子邮件、事件日志),root logger级别,最后添加
元素。这就是为什么如果您已经在使用它,我会编写它,否则只需启动SQL Profiler可能会更容易。您应该查看详细信息。
<logger name="NHibernate.SQL">
  <level value="DEBUG"/>
</logger>