【问题标题】:LINQ - Remove Parts of Expression TreeLINQ - 删除表达式树的部分
【发布时间】:2011-08-18 13:11:43
【问题描述】:

我有以下 LINQ 查询:

var query = session.Query<Event>()
    .Fetch(e => e.Venue); // Fetch is an IQueryable extension which does a join

// Code needed here to remove the fetch part

var num = query.Count(); // This then hits the database

不幸的是,这会引发错误,因为 count 方法不支持 fetch。在这个阶段,我确定你在想我为什么不删除 fetch 部分。但是我已经简化了我的例子,这是不可能的。我希望能够做的是导航 LINQ 查询的表达式树,并在调用 Count 之前删除对 Fetch 的任何调用。

如果有人能证明这是怎么可能的,我将不胜感激。谢谢

【问题讨论】:

    标签: c# linq iqueryable


    【解决方案1】:

    可以在运行时更改表达式树(通过在现有的基础上构建一个新的),因为诸如 LINQ to SQL 和 Entity Framework 之类的 O/RM 工具经常这样做,但这并不容易。随着 .NET 4.0 的 ExpressionVisitor 类的引入,它变得更容易了,但仍然不要指望它会简单。

    这是一个article,它显示了一个例子。

    【讨论】:

    • 谢谢,但是虽然我了解如何使用它来创建自己的 Count 扩展方法,但我不知道如何编写 ExpressionVisitor 类来删除当前表达式中对 Fetch 的任何调用。
    【解决方案2】:

    将查询转换为 Enumerable 并像这样调用 Count() 是否有帮助:

    var num = query.AsEnumerable().Count();
    

    这将执行查询,然后对结果进行简单的 Count(),而不是让 Count() 流入 ExpressionTree。

    【讨论】:

    • 谢谢,但是这种方法的问题是它会在进行计数之前从数据库中获取所有数据,这对于大表来说非常慢。
    • @nfplee:是的,我已经认为这会发生,但不幸的是我没有更好的主意。 :-(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多