Когда IQueryable выполняет запрос? - PullRequest
2 голосов
/ 01 марта 2010

Я получил следующий код, который я взломал из примеров на сайте.Это хорошо работает, но я не совсем понимаю, как это работает ...

public static Func<EuvaTransientDataContext, string, string, int, IQueryable<SecurityAudit>>
    MatchedIPAddressesAuditRecords =
        CompiledQuery.Compile((EuvaTransientDataContext db, string username, string ipAddress, int withinHours) =>
            (from sa in db.SecurityAudits
             where sa.IPAddress == ipAddress &&
                   sa.Username != username &&
                   sa.AuditDateTime >= DateTime.Now.AddHours(withinHours * -1)
             select sa));

Я ценю, что код немного специфичен, но я думаю, что происходит следующим образом:

  • Я создаю делегат, который принимает несколько параметров и возвращает IQuerable, набранный в SecurityAudit.
  • Я создаю скомпилированный запрос и т. Д.

Теперь я могупотреблять это, выполняя что-то вроде этого (извините, у меня нет точного кода под рукой) ...

IList = someDataContext.MatchedIPAddressesAuditRecords ("username", "ipaddress", 24).ToList ();

Что я не понимаю, так это то, как здесь работает IQueryable?- Я возвращаю интерфейс для запроса к моему вызывающему методу?- Где хранится мой скомпилированный запрос и когда он выполняется?- Какое значение имеет возвращение интерфейса IQueryable?

Было бы полезно получить некоторое объяснение о том, как это на самом деле работает.

Спасибо.

1 Ответ

0 голосов
/ 02 марта 2010

CompiledQuery.Compile вызывается один раз в статическом конструкторе.
Этот метод создает экземпляр CompiledQuery, сохраняет запрос в этом экземпляре и возвращает ссылку на его метод времени выполнения, который будет вызываться кодом пользователя.
Когда пользователь выполняет метод, запрос компилируется (только в первый раз), и метод выполняется.

...