拦截'表达式'属性,并获取它的e-sql

本文关键字:e-sql 获取 属性 表达式 拦截 | 更新日期: 2023-09-27 18:09:36

通常我可以用典型的方式使用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实例,并通过实际传递一个表达式实例来"设置"底层提供者使用的表达式,这是可能的吗?当然,默认情况下IQueryable上没有setter。更具体地说,我只需要一个ObjectQuery,这样我就可以调用ToTraceString()并在另一端获得实体sql。我似乎找不到任何可以直接注入表达式的点。

谢谢。

拦截'表达式'属性,并获取它的e-sql

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

我在NHibernate中使用它来实现与你描述的类似的结果,它似乎工作得很好。(虽然有一点让你的头,所以正如其他人所建议的,WCF数据服务/OData会更快/更容易)。

实际上,你有两个选择。

  1. 不要通过线路传递一般查询。服务器应该有一个客户端调用的GetProductsWithProductIdGreaterThan方法

  2. 查看WCF数据服务

第三个选择,也就是你要求的那个,很难。=即使你对LINQ, WCF和Expression非常熟练,这仍然是非常困难的。