当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《执行IQueryable查询的一部分并将其余部分推迟到LinqforObjects》经验,为你挑选了1个好方法。

我有一个Linq提供程序成功地从我选择的数据源获取数据,但是我现在想要做的是我有我的过滤结果集,允许Linq to Objects处理Expression树的其余部分(对于像Joins这样的东西,投影等)

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

有任何想法吗?

编辑:这里有一些好的答案,但给出了表格......

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

在我的提供程序中,我可以轻松地从客户和订单中获取2个结果集,如果数据来自SQL源,我将构建并传递SQL Join语法,但是这种情况下数据不是来自SQL源,所以我需要做的代码中加入...但我说我有2分结果集,和LINQ到对象可以做一个连接...(以及后来的投影)这将是真正的好,只是代替表达常数MyProv.TableMyProv.TableListList让一个List<>提供者处理表达式......这可能吗?怎么样?



1> Lucas..:

以前的两个答案都有效,但如果你使用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

推荐阅读
李桂平2402851397
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有