我从网站示例中获得了以下代码。它工作得很好,但我不太明白如何它是如何工作的......
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 的委托(delegate)。
- 我正在创建编译查询等。
我现在可以通过做这样的事情来使用它(抱歉,我手头没有确切的代码)...
IList = someDataContext.MatchedIPAddressesAuditRecords("用户名", "ipaddress", 24).ToList();
我不明白 IQueryable 在这里是如何工作的? - 我是否将查询接口(interface)返回到我的调用方法? - 我的编译查询存储在哪里以及何时执行? - 返回接口(interface) IQueryable 的相关性是什么?
如果能解释一下这实际上是如何工作的,那就太好了。
谢谢。
最佳答案
CompiledQuery.Compile 在静态构造函数中被调用一次。
此方法创建 CompiledQuery 的实例,将查询保存在该实例中并返回对其运行时方法的引用,该方法将由用户代码调用。
当用户执行该方法时,将编译查询(仅限第一次)并执行该方法。
关于linq-to-sql - IQueryable 什么时候执行查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2355020/