我遇到一个问题,如下所示的查询按位操作生成N + 1选择:
var files = (from f in Session.Query<File>()
where f.ProjectID == id && ((f.State & FileState.WaitingForFile) == FileState.WaitingForFile)
select f;
NHibernate不是生成预期的SQL,而是执行N + 1选择(File中的所有行)并测试客户端上的二进制条件。该问题似乎与延迟加载有关,因为NHibernateProfiler在其堆栈跟踪中显示以下罪魁祸首:FileProxy.get_State
如何让NHibernate生成正确的SQL(ProjectID = x AND State&amp; y = y)?
详细信息如下:
我正在使用NHibernate 3.2.0.4。
以下是我正在使用的课程:
public class File
{
public virtual int ID { get; set; }
public virtual int ProjectID { get; set; }
public virtual AttachedFileType AttachedFileType { get; set; }
public virtual FileState State { get; set; }
[...]
}
[Flags]
public enum FileState
{
None = 0x0,
Available = 0x1,
WaitingForFile = 0x2,
Archived = 0x4,
[...]
}
感谢您的时间。
答案 0 :(得分:0)
我发现了问题:我实际上是在实体的ISet上运行查询,而不是像我的简化示例中的Session.Query()。当通过延迟加载访问 f.State 时,这会导致选择N + 1模式。
哎呀:)