IQueryable何时执行查询?

时间:2010-03-01 10:07:16

标签: linq-to-sql datacontext iqueryable

我已经从网站示例中获取了以下代码。它工作得很好,但我真的不明白 它是如何工作的......

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));

我很欣赏代码有点具体,但我认为发生的情况如下:

  • 我正在创建一个委托,它接受一些参数并返回一个类型为SecurityAudit的IQuerable。
  • 我正在创建一个编译查询等。

我现在可以通过做这样的事情来消费这个(对不起,我没有完全代码可以提供)......

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

我不明白IQueryable是如何在这里工作的? - 我是否将查询的接口返回给我的调用方法? - 我的编译查询存储在何处以及何时执行? - 返回接口IQueryable的相关性是什么?

对于这实际上是如何运作的一些解释会非常有用。

感谢。

1 个答案:

答案 0 :(得分:0)

CompiledQuery.Compile在静态构造函数中调用一次。
此方法创建CompiledQuery的实例,在此实例中保存查询,并返回将由用户代码调用的运行时方法的引用。
当用户执行该方法时,将编译查询(仅限第一次)并执行该方法。