LINQ - 删除表达式树的部分

时间:2011-08-18 13:11:43

标签: c# linq iqueryable

我有以下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。在这个阶段,我确定你在想为什么我不删除获取部分。但是我简化了我的例子,这是不可能的。理想情况下,我希望能够做的是导航LINQ查询的表达式树,并在调用Count之前删除对Fetch的任何调用。

如果有人能证明这是可能的,我会很感激。感谢

2 个答案:

答案 0 :(得分:3)

可以在运行时更改表达式树(通过从现有树中构建一个新表达式树),因为诸如LINQ to SQL和Entity Framework之类的O / RM工具会不断地执行此操作,但这并不容易。引入ExpressionVisitor类的.NET 4.0变得更容易,但仍然不希望它变得简单。

以下是article,其中显示了一个示例。

答案 1 :(得分:0)

将查询转换为Enumerable并在此处调用Count()会有所帮助:

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

这将执行查询,然后在结果上生成一个简单的Count(),而不是让Count()流入ExpressionTree。