2012-01-23 22 views
2

我有其中上類似下面的查詢的逐位操作來生成N + 1只選擇一個問題:如何查詢使用的LINQ位運算符枚舉標誌來NHibernate的

var files = (from f in Session.Query<File>() 
    where f.ProjectID == id && ((f.State & FileState.WaitingForFile) == FileState.WaitingForFile) 
    select f; 

代替生成預期SQL的,NHibernate的執行N + 1選擇(File中的所有行)並測試客戶機上的二進制條件。這個問題似乎與延遲加載鏈接爲NHibernateProfiler顯示其堆棧跟蹤以下的罪魁禍首:FileProxy.get_State

如何讓NHibernate的生成正確的SQL(其中專案編號= X和國家& 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

它爲我工作。你的查詢有一個左括號但沒有右括號。也許你確實忽略了一個重要的細節? – Firo

回答

0

我發現問題:我實際上是在實體的ISet上運行查詢,而不是從Session.Query()中運行查詢,如我的簡單示例中所示。當通過延遲加載訪問f.State時,這導致選擇N + 1模式。

哎呦:)