表达式树序列化器

2024-05-01

我想在客户端使用 Linq 表达式,序列化它们并在服务器端执行它们。

为此我想使用:http://expresstree.codeplex.com/ http://expressiontree.codeplex.com/

但我想针对自己的 WCF 调用执行它们。

这意味着我在 WCF 方面有一个电话:

ImageDTO[] GetImages(XElement exp);

我现在希望在客户端有一个 IQueryable(我可以在其上执行 Linq 表达式),并且在服务器端有一个 IQueryable(从我的数据访问层,我想在其上执行序列化表达式)。

但我不知道如何做到这一点,而且我没有找到任何例子......

在客户端,我认为我应该在类中实现查询,我在构造函数中告诉这个类使用我的 QueryProvider 实现(从我调用 WCF 服务的地方)。但我不确定这是否正确......

也许有人可以帮忙举个例子。


有一个实现IQueryable<T>在框架中——MSDN: EnumerableQuery<T> http://msdn.microsoft.com/en-us/library/cc190116.aspx

如果您可以在客户端上使用它来构建查询,您可以从IQueryable<T>.Expression财产。

您必须对其进行测试,看看它是否适用于该表达式树序列化器。

var iQueryable = new EnumerableQuery<Model>( Enumerable.Empty<Model>() );

var query = iQueryable.Include( ... ).Where( ... ).OrderBy( ... );

var expressionTree = query.Expression;

然后,您可以序列化表达式,将其喷射到线路上,然后反序列化。


那么问题是表达式树是基于EnumerableQuery<T>.

所以你需要用你的替换它IQueryable<T>来源自您的真实DbContext

这得到一个bit凌乱,但我已经使用一个编写了一个实现ExpressionVisitor:

IQueryable FixupExpressionTree( ObjectContext ctx, Type entityType, Expression expression )
{
    var tObjectContext = ctx.GetType();
    var mCreateObjectSetOpen = tObjectContext.GetMethod( "CreateObjectSet", new Type[ 0 ] );
    var mCreateObjectSetClosed = mCreateObjectSetOpen.MakeGenericMethod( entityType );

    var objectQuery = ( ObjectQuery ) mCreateObjectSetClosed.Invoke( ctx, null );

    var eFixed = new Visitor( objectQuery, entityType ).Visit( expression );

    var qFixed = ( ( IQueryable ) objectQuery ).Provider.CreateQuery( eFixed );

    return qFixed;
}

and the ExpressionVisitor itself:

public class Visitor : ExpressionVisitor
{
    ObjectQuery _Source = null;
    Type _EntityType = null;

    public Visitor( ObjectQuery source, Type entityType ) { _Source = source; _EntityType = entityType; }

    protected override Expression VisitConstant( ConstantExpression node )
    {
        if ( !node.Type.Name.Contains( "EnumerableQuery" ) ) return base.VisitConstant( node );

        var eConstantInstance = Expression.Constant( _Source );
        var eConstantArgument = Expression.Constant( MergeOption.AppendOnly );

        var tObjectQueryOpen = typeof( ObjectQuery<> );
        var tObjectQueryClosed = tObjectQueryOpen.MakeGenericType( _EntityType );
        var eMergeAsMethod = tObjectQueryClosed.GetMethod( "MergeAs", BindingFlags.Instance | BindingFlags.NonPublic );

        return Expression.Call( eConstantInstance, eMergeAsMethod, eConstantArgument );
    }
}

调用它很简单:

Type entityType = ...
Expression expression = ...
DbContext db = ...

ObjectContext ctx = ( ( IObjectContextAdapter ) db ).ObjectContext;

IQueryable query = FixupExpressionTree( ctx, entityType, expression );
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

表达式树序列化器 的相关文章

  • 创建 DirectoryEntry 实例以供测试使用

    我正在尝试创建 DirectoryEntry 的实例 以便可以使用它来测试将传递 DirectoryEntry 的一些代码 然而 尽管进行了很多尝试 我还是找不到实例化 DE 并初始化它的 PropertyCollection 的方法 我有
  • C++:无法使用scoped_allocator_adaptor传播polymorphic_allocator

    我有一个vector
  • 如何在 Unity 中从 RenderTexture 访问原始数据

    问题的简短版本 我正在尝试访问 Unity 中 RenderTexture 的内容 我一直在使用 Graphics Blit 使用自己的材质进行绘制 Graphics Blit null renderTexture material 我的材
  • Func 方法参数的首选命名约定是什么?

    我承认这个问题是主观的 但我对社区的观点感兴趣 我有一个缓存类 它采用类型的缓存加载器函数Func
  • 如何在C++中实现模板类协变?

    是否可以以这样一种方式实现类模板 如果模板参数相关 一个对象可以转换为另一个对象 这是一个展示这个想法的例子 当然它不会编译 struct Base struct Derived Base template
  • 嵌入式系统中的malloc [重复]

    这个问题在这里已经有答案了 我正在使用嵌入式系统 该应用程序在 AT91SAMxxxx 和 cortex m3 lpc17xxx 上运行 我正在研究动态内存分配 因为它会极大地改变应用程序的外观 并给我更多的力量 我认为我唯一真正的路线是为
  • fgets() 和 Ctrl+D,三次才能结束?

    I don t understand why I need press Ctrl D for three times to send the EOF In addition if I press Enter then it only too
  • C# 中值类型和引用类型有什么区别? [复制]

    这个问题在这里已经有答案了 我知道一些差异 值类型存储在堆栈上 而引用类型存储在托管堆上 值类型变量直接包含它们的值 而引用变量仅包含对托管堆上创建的对象位置的引用 我错过了任何其他区别吗 如果是的话 它们是什么 请阅读 堆栈是一个实现细节
  • 跨多个控件共享事件处理程序

    在我用 C 编写的 Windows 窗体应用程序中 我有一堆按钮 当用户的鼠标悬停在按钮上时 我希望按钮的边框发生变化 目前我有以下多个实例 每个按钮一个副本 private void btnStopServer MouseEnter ob
  • c# Asp.NET MVC 使用FileStreamResult下载excel文件

    我需要构建一个方法 它将接收模型 从中构建excel 构建和接收部分完成没有问题 然后使用内存流导出 让用户下载它 不将其保存在服务器上 我是 ASP NET 和 MVC 的新手 所以我找到了指南并将其构建为教程项目 public File
  • HttpClient 像浏览器一样请求

    当我通过 HttpClient 类调用网站 www livescore com 时 我总是收到错误 500 可能服务器阻止了来自 HttpClient 的请求 1 还有其他方法可以从网页获取html吗 2 如何设置标题来获取html内容 当
  • 使用 LINQ 查找列表中特定类型的第一个元素

    使用 LINQ 和 C 在元素列表中查找特定类型的第一个项目的最短表示法是什么 var first yourCollection OfType
  • 像“1$”这样的位置参数如何与 printf() 一起使用?

    By man I find printf d width num and printf 2 1 d width num 是等价的 但在我看来 第二种风格应该与以下相同 printf d num width 然而通过测试似乎man是对的 为什
  • 网络参考共享类

    我用 Java 编写了一些 SOAP Web 服务 在 JBoss 5 1 上运行 其中两个共享一个类 AddressTO Web 服务在我的 ApplycationServer 上正确部署 一切都很顺利 直到我尝试在我的 C 客户端中使用
  • 检查 url 是否指向文件或页面

    我们需要以下内容 如果文件确实是文件 则从 URL 下载该文件 否则 如果它是一个页面 则什么也不做 举个简单的例子 我有以下命令来下载文件 My Computer Network DownloadFile http www wired c
  • 将日期参数传递给对 MVC 操作的 ajax 调用的安全方法

    我有一个 MVC 操作 它的参数之一是DateTime如果我通过 17 07 2012 它会抛出一个异常 指出参数为空但不能有空值 但如果我通过01 07 2012它被解析为Jan 07 2012 我将日期传递给 ajax 调用DD MM
  • 方法参数内的变量赋值

    我刚刚发现 通过发现错误 你可以这样做 string s 3 int i int TryParse s hello out i returns false 使用赋值的返回值是否合法 Obviously i is but is this th
  • 窗体最大化时自动缩放子控件

    有没有办法在最大化屏幕或更改分辨率时使 Windows 窗体上的所有内容自动缩放 我发现手动缩放它是正确的 但是当切换分辨率时我每次都必须更改它 this AutoScaleDimensions new System Drawing Siz
  • 将变量分配给另一个变量,并将一个变量的更改反映到另一个变量中

    是否可以将一个变量分配给另一个变量 并且当您更改第二个变量时 更改会瀑布式下降到第一个变量 像这样 int a 0 int b a b 1 现在 b 和 a 都 1 我问这个问题的原因是因为我有 4 个要跟踪的对象 并且我使用名为 curr
  • C++ 成员函数中的“if (!this)”有多糟糕?

    如果我遇到旧代码if this return 在应用程序中 这种风险有多严重 它是一个危险的定时炸弹 需要立即在应用程序范围内进行搜索和销毁工作 还是更像是一种可以悄悄留在原处的代码气味 我不打算writing当然 执行此操作的代码 相反

随机推荐

  • 有没有办法阻止cfchart强制js进入响应内容?

    更新 已报告错误 感谢投票https tracker adobe com view CF 4200017 https tracker adobe com view CF 4200017 我们正在从 ColdFusion 10 迁移到 201
  • 如何使用 jQuery Nestable 插件和 Codeigniter 创建子菜单?

    我在用着jQuery 可嵌套插件 with 代码点火器 3为网站创建 5 级菜单 这是一个很好的解决方案 用户可以通过拖放来更改菜单项的级别和位置 然而 我的下面的函数只能创建第一级菜单 当我更改为菜单项的子级 2 3 4 5 时 它对我不
  • 使用 ANTLR 解析时忽略输入的某些部分

    我正在尝试通过 ANTLR ANTLRWorks 3 5 2 解析语言 目标是输入完整的输入 但 Antlr 给出语法中定义部分的解析树并忽略其余输入 例如这是我的语法 grammar asap project begin PROJECT
  • 数据类的子类,带有一些断言

    我有一个冻结的数据类MyData保存数据 我想要一个杰出的子类MySpecialData只能保存长度为1的数据 这是一个有效的实现 from dataclasses import dataclass field dataclass froz
  • Google Developers Console 的项目配额

    当我尝试向我的项目添加新项目时开发者控制台 https console developers google com project 我收到此消息 You have exceeded the quota for project creatio
  • nuget 规范依赖项,获取最新版本吗?

    In the nuspec 版本控制文档 http docs nuget org docs reference versioning I see 1 0 1 0 x 1 0 x 1 0 1 0 x lt 1 0 1 0 x 1 0 1 0
  • 高效快速的线程参数方法

    创建带参数的线程最有效的方法是什么 参数是一个结构体 如果该结构体不能保留在父线程堆栈上 有两种解决方案 具有动态内存分配 struct Arg int x int y void my thread void v arg Arg arg A
  • Fortran if stop 需要 endif 吗?

    在 fortran 90 中 if stop 语句是否需要结束 endif example if foo eq 1 stop do some stuff do some stuff 是循环的一部分还是 stop 意味着程序结束时 endif
  • 移动 SVN 存储库后的 git-svn ?

    我们最近将 SVN 服务器从一个数据中心迁移到另一个数据中心 并且服务器的 IP 发生了变化 我用了svn switch relocate old url new url更新我的实际工作副本 这很高兴 然而 我的大部分工作都是在本地 git
  • 如何在 MATLAB 中创建带有分级标记颜色的散点图?

    我想在 MATLAB 中绘制一个简单的散点图 标记颜色从光谱的一端到另一端各不相同 例如红色 橙色 黄色 蓝色 紫色 我的数据比较了一段时间内河流的水量和水质 3 个简单的列 时间 水量 质量 我想绘制数量与质量的 x y 散点图 但颜色随
  • C#中私有类的概念

    除了内部类之外 C 中是否可以存在私有类 根本不 除非它在嵌套类中 否则什么都没有 未嵌套在其他类或结构中的类和结构可以是public or internal 声明为 public 的类型可由任何其他类型访问 声明为内部的类型只能由同一程序
  • android-sdk/tools/ant/build.xml:698: 返回 null: 1

    我正在尝试测试 Android 版本 以确保不会发生意外情况 尝试从命令行使用 ant 构建时 usr local bin ant release BUILD FAILED android sdk tools ant build xml 6
  • Node.js + Express + Redis,什么时候关闭连接?

    我有一个使用的节点应用程序Express http expressjs com and 节点redis https github com mranney node redis 我正在遵循中概述的方法学习节点 http shop oreill
  • 每次我们想在应用程序中更改字体时,是否都必须复制 Font TTF

    以前 为了使我的应用程序可以在 Gingerbread 及以上设备中运行 我必须将 Robotto 字体资源复制到 asset 文件夹中 这是因为 Gingerbread 本身不附带 Robotto 字体 但是 假设我决定仅将我的应用程序部
  • Eclipse 在不存在的断点处停止

    我有一个 Eclipse java 项目 它在不存在的断点处停止 这个位置曾经有一个断点 但我把它删除了 有什么想法为什么会发生这种情况吗 注意 这与这里提到的问题不同 幻象断点让我发疯 https stackoverflow com qu
  • 如何在 Vim 中转置文件中的行和列的内容?

    我知道我可以使用 Awk 但我使用的是 Windows 机器 并且我正在为可能没有 Awk 的其他人创建一个函数 我也知道我可以编写 C 程序 但我不希望我正在制作的 Vim 实用程序需要编译和维护 原始文件可能是 THE DAY WAS
  • Rmarkdown:同一页面上的多个图具有单独的标题

    我正在用 R markdown 编写一份带有 pdf 输出的报告 我有几个图 我想在 2x2 矩阵中每页显示四个图 有没有办法让它们像这样显示并带有单独的标题 这是我到目前为止所尝试过的 包 gridExtra 我可以轻松设置我想要的布局
  • jquery给输入框添加百分号

    我想要一个输入框 在输入数字时自动向用户添加可见的百分号 而不仅仅是在提交时将其识别为百分比 因此 用户点击 2 并看到 2 我假设人们可以使用 Jquery 相当轻松地做到这一点 但我不知道如何做 有任何想法吗 感谢大家 您可以处理cha
  • 使用 React Hooks 输入千位分隔符

    我想使用 React Hooks 在输入上添加千位分隔符 但我不知道如何操作 到目前为止我已经尝试过下面的代码但不起作用 您能否指出可能出现的问题以及我该如何实施 谢谢 const MainComponent gt const value
  • 表达式树序列化器

    我想在客户端使用 Linq 表达式 序列化它们并在服务器端执行它们 为此我想使用 http expresstree codeplex com http expressiontree codeplex com 但我想针对自己的 WCF 调用执