c# - 执行 IQueryable 查询的一部分并将其余部分推迟到 Linq for Objects

标签 c# linq expression-trees iqueryable

我有一个 Linq 提供程序,它成功地从我选择的数据源获取数据,但是我现在想做的是,我有我的过滤结果集,允许 Linq to Objects 处理表达式树的其余部分(对于事物像连接、投影等)

我的想法是,我可以通过 ExpressionVisitor 将包含我的 IQueryProvider 的表达式常量替换为结果集 IEnumerable,然后返回该新表达式。还从我的 IQueryable 返回 IEnumerable 的提供程序...但这似乎不起作用:-(

有什么想法吗?

编辑: 这里有一些很好的答案,但给出的形式......

var qry = from c in MyProv.Table<Customer>()
          Join o in MyProv.Table<Order>() on c.OrderID equals o.ID
          select new 
          {
            CustID = c.ID,
            OrderID = o.ID
          }

在我的提供商中,我可以轻松地从客户和订单中取回 2 个结果集,如果数据来自 SQL 源,我将只构建并传递 SQL Join 语法,但在这种情况下,数据不是来自 SQL源,所以我需要在代码中加入...但正如我所说,我有 2 个结果集,Linq to Objects 可以进行加入...(以及后来的投影)只是替换表达式常量 MyProv.Table<Customer>MyProv.Table<Order>List<Customer>List<Order>并让 List<>提供商处理表达式...这可能吗?怎么办?

最佳答案

前面的两个答案都有效,但如果您使用 AsEnumerable() 将 IQueryable 转换为 IEnumerable,它会更好读:

// Using Bob's code...
var result = datacontext.Table
   .Where(x => x.Prop == val)
   .OrderBy(x => x.Prop2)
   .AsEnumerable()  //  <---- anything after this is done by LINQ to Objects
   .Select(x => new { CoolProperty = x.Prop, OtherProperty = x.Prop2 });

编辑:

// ... or MichaelGG's
var res = dc.Foos
           .Where(x => x.Bla > 0)  // uses IQueryable provider
           .AsEnumerable()
           .Where(y => y.Snag > 0); // IEnumerable, uses LINQ to Objects

关于c# - 执行 IQueryable 查询的一部分并将其余部分推迟到 Linq for Objects,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/695678/

相关文章:

c# - 可移植类库中的 ConcurrentBag 替代方案

c# - 根据使用 httpcontext asp.net mvc 登录的用户获取时区

ios - 在 iOS 上使用 C# 的 LINQ OrderBy 的 JIT 错误

c# - 如何创建表达式树以执行与 "StartsWith"相同的操作

c# - TreeMap 的旅行商问题(无汉密尔顿路径)

c# - 如何在.NET 中安装 Windows 服务?

c# - 将 SQL 中的 Yes/No/Null 转换为 DataTable 中的 True/False

c# - LINQ Distinct 与自定义 IEqualityComparer

c# - 解析传递给 LINQ 表达式所在方法的 LINQ 参数

c# - 使用表达式参数化属性名称