Как запросить флаги перечисления с помощью побитовых операторов в Linq to NHibernate - PullRequest
2 голосов
/ 24 января 2012

У меня проблема, когда побитовая операция над запросом, подобным следующему, генерирует N + 1 выбор:

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

Вместо генерирования ожидаемого SQL, NHibernate выполняет 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,
    [...]
}

Спасибо за ваше время.

1 Ответ

0 голосов
/ 24 января 2012

Я обнаружил проблему: я фактически выполнял запрос на ISet объекта, а не из Session.Query (), как в моем упрощенном примере.Это вызвало шаблон выбора N + 1 при доступе к f.State через ленивую загрузку.

К сожалению:)

...