2010-03-01 72 views
2

我得到了下面的代码,我从网站的例子一起入侵。它工作得很好,但我不真正了解它是如何工作的 ...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)); 

我欣赏的代码是有点特殊,但我认为正在发生的事情如下:

  • 我创建委托,它接受许多参数并返回一个IQAllrable键入SecurityAudit。
  • 我创建一个编译的查询等

我可以通过做somethign像这样(对不起,我没有这个确切代码手)现在消耗这个...

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

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

对于如何实际工作的一些解释很有帮助。

谢谢。

+0

想到这可能会发生什么是IQueryable表示从我的编译查询返回的表达式树。 ToList ()被调用时评估该表达式树。这可能吗? – Remotec 2010-03-02 11:54:04

回答

0

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