c# - 拦截IQueryable Provider的 'Expression'属性并获取其e-sql

标签 c# wcf linq entity-framework-4 xml-serialization

通常我可以使用 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/

相关文章:

c# - GDI+ 异常将位图保存到 MemoryStream

c# - MVVM 通用 app.config

wcf - 在 IIS 6 上启用 WCF REST Api 上的 PUT(没有 .svc 文件)

c# - 找不到引用契约(Contract)的默认端点元素

c# - 在单击 RadioButton 之前保持按钮不可见 c#

c# - 是否可以禁用 C# 中下拉列表组合框中的项目?

c# - 来电显示检测 : Doesnt work with some phones

c# - LINQPad,使用多个数据上下文

c# - 如果 IEnumerable<string> 只返回一个字符串怎么办

c# - 在没有 Linq 的情况下为 IList 的 IList 删除重复项