如何在Linq到NHibernate中使用逐位运算符查询枚举标志
本文关键字:运算符 查询 标志 枚举 Linq NHibernate | 更新日期: 2023-09-27 18:21:07
我遇到了一个问题,对如下查询的逐位操作会生成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选择(文件中的所有行)并在客户端上测试二进制条件。该问题似乎与懒惰加载有关,因为NHibernateProfiler在其堆栈跟踪中显示了以下罪魁祸首:FileProxy.get_State
如何让NHibernate生成正确的SQL(其中ProjectID=x AND State&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,
[...]
}
谢谢你抽出时间。
我发现了问题:我实际上是在实体的ISet上运行查询,而不是像我的简化示例中那样从Session.query()运行查询。这导致在通过延迟加载访问f.State时选择N+1模式。
Whoops:)