我有一个 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/