C# 拦截';表达式';属性,并获取其e-sql
通常我可以使用linq以典型方式查询实体上下文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的新实例,并通过实际传入表达式实例来“设置”底层提供程序使用的表达式,这
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);