拦截'表达式'属性,并获取它的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。我似乎找不到任何可以直接注入表达式的点。
谢谢。
我建议你看看InterLINQ。它提供了序列化表达式和通过WCF传输的能力。
我在NHibernate中使用它来实现与你描述的类似的结果,它似乎工作得很好。(虽然有一点让你的头,所以正如其他人所建议的,WCF数据服务/OData会更快/更容易)。
实际上,你有两个选择。
-
不要通过线路传递一般查询。服务器应该有一个客户端调用的
GetProductsWithProductIdGreaterThan
方法 -
查看WCF数据服务
第三个选择,也就是你要求的那个,很难。=即使你对LINQ, WCF和Expression
非常熟练,这仍然是非常困难的。