通常我可以使用 linq 以典型方式查询实体上下文,
IQueryable<Product> query = from p in db.Products
where p.ProductID > 1
select query;
现在假设我想要获取此 IQueryable 的表达式,将其序列化,并将其通过线路传递以在另一端重建,
Expression ex = query.Expression;
XElement xExpression = serializer.Serialize(ex);
wcfClient.InvokeSomeServiceMethod(xExpression);
我如何在另一端重建这个? (具体为服务器端)
我需要创建一个新的 IQueryable 实例,并通过实际传入一个 Expression 实例来“设置”底层提供程序使用的表达式,这可能吗?当然,默认情况下 IQueryable 上没有 setter 。更具体地说,我只需要一个 ObjectQuery,这样我就可以调用 ToTraceString() 并获取另一端的实体 sql。我似乎找不到任何可以直接注入(inject)表达式的点。
谢谢。
最佳答案
我建议您查看InterLINQ 。它提供了序列化表达式并通过 WCF 进行传输的能力。
我将它与 NHibernate 一起使用来实现与您所描述的类似的结果,并且它似乎工作得很好。 (不过,有一点需要您理解,因此正如其他人所建议的那样,WCF 数据服务/OData 会更快/更容易)。
关于c# - 拦截IQueryable Provider的 'Expression'属性并获取其e-sql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7521621/