C# 拦截';表达式';属性,并获取其e-sql

C# 拦截';表达式';属性,并获取其e-sql,c#,wcf,linq,entity-framework-4,xml-serialization,C#,Wcf,Linq,Entity Framework 4,Xml Serialization,通常我可以使用linq以典型方式查询实体上下文 IQueryable<Product> query = from p in db.Products where p.ProductID > 1 select query; 我如何在另一端重建它?(具体来说是服务器端) 我需要创建IQueryable的新实例,并通过实际传入表达式实例来“设置”底层提供程序使用的表达式,这

通常我可以使用linq以典型方式查询实体上下文

IQueryable<Product> query = from p in db.Products
                            where p.ProductID > 1
                            select query;
我如何在另一端重建它?(具体来说是服务器端)

我需要创建IQueryable的新实例,并通过实际传入表达式实例来“设置”底层提供程序使用的表达式,这可能吗?当然,默认情况下IQueryable上没有setter。更具体地说,我只需要一个ObjectQuery,这样我就可以调用ToTraceString()并在另一端获取实体sql。我似乎找不到任何可以直接注入表达式的点


谢谢。

真的,你有两个选择

  • 不要通过电话传递一般性的询问。服务器应具有客户端调用的
    GetProductsWithProductIdGreaterThan
    方法


  • 第三个选项,即您请求的选项,非常困难。=即使您非常熟练地使用LINQ、WCF和
    表达式,也非常困难。

    我建议您看看。它提供了序列化表达式并通过WCF传输的能力


    我将它与NHibernate一起使用,以获得与您所描述的类似的结果,并且它似乎工作得很好。(不过,还有一点需要考虑,因此正如其他人所建议的,WCF Data Services/OData会更快/更容易)。

    您的问题是:如何在服务器内部传递和调用查询?是的,基本上是这样。但我需要传入一个表达式实例,因为查询是在客户端而不是服务器上编写的,这并不容易。例如,看看OData是如何做到这一点的(通过线路进行passess查询并在服务器端重建它)我认为第一个选项是最简单的,但是它不是动态的,因为带有OData的rest+1 WCF数据服务正是针对这种情况的,否则您将编写自己的来处理服务器端和客户端-顺便说一句。表达式树不可序列化,因此您还必须创建自己的序列化过程,以便将它们从服务器传递到客户端。
    Expression ex = query.Expression;
    
    XElement xExpression = serializer.Serialize(ex); 
    
    wcfClient.InvokeSomeServiceMethod(xExpression);