c# - 如何维护LINQ延迟执行?

标签 c# linq iqueryable deferred-execution

假设我有一个 IQueryable<T>我想封装其定义的表达式,存储它并重用它或稍后将它嵌入到更大的查询中。例如:

IQueryable<Foo> myQuery =
    from foo in blah.Foos
    where foo.Bar == bar
    select foo;

现在我相信我可以保留那个 myQuery 对象并像我描述的那样使用它。但有些事情我不确定:

  1. 如何最好地对其进行参数化? 最初我在一个方法中定义了它,然后返回了 IQueryable<T>作为该方法的结果。这样我就可以定义 blahbar作为方法参数,我猜它只是创建了一个新的 IQueryable<T>每一次。这是封装 IQueryable<T> 逻辑的最佳方式吗? ?还有其他方法吗?

  2. 如果我的查询解析为标量而不是 IQueryable 怎么办? ? 例如,如果我希望此查询与显示的完全相同但附加了 .Any() 怎么办?让我知道是否有匹配的结果?如果我添加 (...).Any()那么结果是bool并立即执行,对吗?有没有办法利用这些 Queryable运营商( AnySindleOrDefault 等)而不立即执行? LINQ-to-SQL 如何处理这个问题?

编辑:第 2 部分实际上更多地是试图理解 IQueryable<T>.Where(Expression<Func<T, bool>>) 之间的限制差异是什么。与 IQueryable<T>.Any(Expression<Func<T, bool>>) .在创建要延迟执行的较大查询时,后者似乎不那么灵活。 Where()可以追加,然后可以稍后追加其他构造,然后最终执行。自 Any()返回一个标量值,听起来它会在构建其余查询之前立即执行。

最佳答案

  1. 当您使用 DataContext 时,您必须非常小心地传递 IQueryable,因为一旦上下文被释放,您将无法再在该 IQueryable 上执行。如果您没有使用上下文,那么您可能没问题,但请注意这一点。

  2. .Any() 和 .FirstOrDefault() 延迟。当您调用它们时,它们导致执行。但是,这可能不会像您认为的那样。例如,在 LINQ to SQL 中,如果您对 IQueryable 执行 .Any(),它基本上充当 IF EXISTS(SQL HERE)。

如果您愿意,可以像这样链接 IQueryable:

var firstQuery = from f in context.Foos
                    where f.Bar == bar
                    select f;

var secondQuery = from f in firstQuery
                    where f.Bar == anotherBar
                    orderby f.SomeDate
                    select f;

if (secondQuery.Any())  //immediately executes IF EXISTS( second query in SQL )
{
    //causes execution on second query 
    //and allows you to enumerate through the results
    foreach (var foo in secondQuery)  
    {
        //do something
    }

    //or

    //immediately executes second query in SQL with a TOP 1 
    //or something like that
    var foo = secondQuery.FirstOrDefault(); 
}

关于c# - 如何维护LINQ延迟执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1308129/

相关文章:

c# - 有趣的 LinqToSql 行为

c# - 在 C# 中将视频的所有帧提取为图像的最快方法是什么?

c# - 是否可以获取 IQueryable<T> 上使用的谓词 (Expression<Func<T,bool>>) 并将其应用于另一个 Lambda 函数?

C# 如何序列化 system.linq.expressions?

c# - 如何使 LINQ-to-Objects 处理投影?

c# - WCF 反序列化返回 0 个列表元素

c# - 如果属性为空,则在字符串中写入 "?"

mysql - Entity Framework 添加方法不可用

c# - 获取具有最高日期的最新记录和组 - LINQ

c# - System.Data.Linq.Mapping 和 System.ComponentModel.DataAnnotations.Schema 中的 TableAttribute 类之间的差异