如何使用Linq中的按位运算符来查询枚举标志到NHibernate

时间:2012-01-23 23:09:44

标签: c# nhibernate fluent-nhibernate linq-to-nhibernate

我遇到一个问题,如下所示的查询按位操作生成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 St​​ate&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,
    [...]
}

感谢您的时间。

1 个答案:

答案 0 :(得分:0)

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

哎呀:)