如何在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,
    [...]
}

谢谢你抽出时间。

如何在Linq到NHibernate中使用逐位运算符查询枚举标志

我发现了问题:我实际上是在实体的ISet上运行查询,而不是像我的简化示例中那样从Session.query()运行查询。这导致在通过延迟加载访问f.State时选择N+1模式。

Whoops:)