当前位置: 首页 > 编程语言 > C#

ExecutepartofanIQueryablequeryanddefertoLinqforObjects分享

时间:2023-04-10 12:59:52 C#

ExecutepartofanIQueryablequeryanddeferresttoLinqforObjects数据源获取数据,但是我现在想做的是我有我的过滤结果集,允许LinqtoObjects处理表达式树的其余部分(对于连接、投影等)我的想法是我可以用包含我的IQueryProvider的表达式常量替换结果集IEnumerable通过ExpressionVisitor,并返回该新表达式。还有从我的IQueryable返回IEnumerable的提供者......但这似乎不起作用:-(有什么想法吗?编辑:这里有一些很好的答案,但给出的形式......varqry=fromcinMyProv。Table()JoinoinMyProv.Table()onc.OrderIDequalso.IDselectnew{CustID=c.ID,OrderID=o.ID}在我的提供商中,我可以很容易地从Customer和OrderFetching获得2个结果集,如果数据来自SQL源,我构建并传递SQLJoin语法,但在这种情况下,数据不是来自SQL源,所以我需要在代码中进行连接......但正如我所说,我有2个结果集,LinqtoObjects可以进行连接......(以及后来的预测)只需将表达式常量MyProv.Table和MyProv.Table替换为List和List并让List提供程序处理表达式......这可能吗?如何?前面的两个答案都有效,但如果您使用AsEnumerable()将IQueryable转换为IEnumerable,效果会更好://使用Bob的代码...varresult=datacontext.Table.Where(x=>x.Prop==val).OrderBy(x=>x.Prop2).AsEnumerable()//new{CoolProperty=x.Prop,OtherProperty=x.Prop2});编辑://...或MichaelGG的varres=dc.Foos.Where(x=>x.Bla>0)//使用IQueryable提供程序.AsEnumerable().Where(y=>y.Snag>0);//IEnumerable,使用LINQtoObjects我所追求的是使用具体的IEnumerable(或IQueryable通过.AsQueryable())结果集替换表达式树中的可查询常量...这是一个复杂的主题,可能只对Linq表达式树访问者等有意义这给了我一条前进的道路……使用系统;使用System.Linq;使用System.Linq.Expressions;命名空间LinqToTerraServerProvider{内部类ExpressionTreeModifier:ExpressionVisitor{privateIQueryablequeryablePlaces;internalExpressionTreeModifier(IQueryableplaces){this.queryablePlaces=places;}internalExpressionCopyAndModify(Expressionexpression){returnthis.Visit(expression);}protectedoverrideExpressionVisitConstant(ConstantExpressionc){//将常量QueryableTerraServerDataarg替换为可查询的Place集合。如果(c.Type==typeof(QueryableTerraServerData))returnExpression.Constant(this.queryablePlaces);否则返回c;如果您实现存储库模式,则只需提供IQueryable返回并抽象出表示例:varqry=fromcinMyProv.Repository()JoinoinMyProv.Repository()onc.OrderIDequalso.IDselectnew{CustID=c.ID,OrderID=o.ID}然后构建您的供应商模型Repository方法中的IQueryable模式,如本文所示。这样,您就可以根据需要编写各种提供程序。您可以拥有LINQ2SQL提供程序,或为内存中提供程序编写单元测试。LINQ2SQL提供程序的存储库方法如下所示:publicIQueryableRepository()whereT:class{ITabletable=_context.GetTable(typeof(T));返回表.Cast();}除非我误解了,否则我通常只是在linq方法链中添加.ToArray(),我希望linq提供程序执行。例如(想想LinqtoSQL)varresult=datacontext.Table.Where(x=>x.Prop==val).OrderBy(x=>x.Prop2).ToArray().Select(x=>new{CoolProperty=x.Prop,OtherProperty=x.Prop2});所以,通过OrderBy()被翻译成SQL,而Select()是LINQtoObjects。Rob的回答很好,但强制进行全面枚举。可以强制转换以保持扩展方法语法和惰性求值:以上就是C#学习教程:ExecutingPartofanIQueryableQueryandDeferringPartofanIQueryableQueryandDeferringParttoLinqforObjects如果对大家有用,需要进一步了解C#,就分享??一下学习教程,希望大家多多关注—varres=((IEnumerable)dc.Foos.Where(x=>x.Bla>0))//IQueryable.Where(y=>y.Snag>0)//IEnumerable本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: