linq-to-sql - IQueryable 什么时候执行查询?

标签 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 的委托(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/

相关文章:

c# - 在 where 表达式中使用 Guid.Empty 挂起 Linq 查询

wpf - 如何将样式绑定(bind)到具有样式元素的任何数据上下文的属性?

c# - 如何将 DataContext 定义从代码隐藏移动到 XAML?

c# - IEnumerable 有效但找不到类型或命名空间 IQueryable - MVC 5

.net - 如何以最佳方式合并 LINQ-to-SQL 查询

linq-to-sql - 使用Linq-to-SQL插入通过反射确定的对象

sql-server - 如何确定 LINQ to SQL 结果集的大小(以字节为单位)

c# - Linq 查询中的 Select 操作何时变为投影操作?

c# - 如何将 IQueryable 转换为 EntityCollection

c# - LinqToSql 奇怪的行为