有没有办法将外部函数内联到 EF Linq 查询中?

2024-04-03

假设我有一个这样的函数:

var filterValue = GetCurrentFilter(state);

然后是 EF 查询:

var result = context.EntitySet.Where(x=> x.column > filterValue);

这是可行的,但是一旦我尝试内联它:

var result = context.EntitySet.Where(x=> x.column > GetCurrentFilter(state));

它不是因为 EF Linq 尝试解析GetCurrentFilter进入表达式树并且无法做到这一点。这都是可以理解的。

我的问题是,有没有办法让 EF Linq 知道需要执行GetCurrentFilter构建树并在树中使用其结果时的函数?

就像是

var result = context.EntitySet.Where(x=> x.column > EfUtil.ResultOf(GetCurrentFilter(state)));

由于 GetCurrentFilter 没有作为查询一部分的参数,如果 EF Linq 可以支持的话,那么在技术上应该可以做到这一点。我怀疑我只是缺少正确的语法。


Make GetCurrentFilter(只读)属性而不是方法。与方法不同,EF 将计算属性的值,而不是尝试将它们转换为 SQL。


您拥有的唯一另一条路是遍历整个表达式树,搜索您的用法ResultOf方法,将其参数计算为一个值,然后将该值内联到ResultOf调用一次,围绕该值重建查询。

为了使其工作,这意味着您不仅需要将要内联的代码包装在调用中EfUtil.ResultOf,但这也意味着在查询本身上调用一个方法来强制它返回并评估它:

public class EfUtil
{
    public static T ResultOf<T>(T value)
    {
        return value;
    }
}
//Note this could probably use a better name
public static IQueryable<T> EvaluateResults<T>(this IQueryable<T> query)
{
    return query.Provider.CreateQuery<T>(
        new ExpressionEvaluator().Visit(query.Expression));
}

internal class ExpressionEvaluator : ExpressionVisitor
{
    protected override Expression VisitMethodCall(MethodCallExpression m)
    {
        if (m.Method.Name == "ResultOf" && m.Method.DeclaringType == typeof(EfUtil))
        {
            Expression target = m.Arguments[0];

            object result = Expression.Lambda(target)
                .Compile()
                .DynamicInvoke();

            return Expression.Constant(result, target.Type);
        }
        else
            return base.VisitMethodCall(m);
    }
}

这将允许你写:

var result = context.EntitySet.Where(x=> x.column > EfUtil.ResultOf(GetCurrentFilter(state)))
    .EvaluateResults();

然后它会评估GetCurrentFilter(state)在客户端并将结果作为常量内联到查询中。

作为一个稍微简单的测试,我们可以编写以下内容:

var query = new[] { 1, 2, 3 }
    .AsQueryable()
    .Where(x => x > EfUtil.ResultOf(Math.Max(1, 2)))
    .EvaluateResults();

Console.WriteLine(query.ToString());

它会打印出:

System.Int32[].Where(x => (x > 2))

这正是我们想要的。

请注意 lambda 参数的使用 (x在这些示例中)不能在调用中的任何地方使用EfUtil.ResultOf否则代码将无法工作,并且不可能使其工作(尽管如果我们足够关心的话,我们可以生成更好的错误消息)。

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

有没有办法将外部函数内联到 EF Linq 查询中? 的相关文章

  • 在 OpenCL 中将函数作为参数传递

    是否可以在 OpenCL 1 2 中将函数指针传递给内核 我知道可以用C实现 但不知道如何在OpenCL的C中实现 编辑 我想做这篇文章中描述的同样的事情 在 C 中如何将函数作为参数传递 https stackoverflow com q
  • Blazor 与 Razor

    随着 Blazor 的发明 我想知道这两种语言之间是否存在显着的效率 无论是在代码创建方面还是在代码的实际编译 执行方面 https github com SteveSanderson Blazor https github com Ste
  • 处理 fanart.tv Web 服务响应 JSON 和 C#

    我正在尝试使用 fanart tv Webservice API 但有几个问题 我正在使用 Json Net Newtonsoft Json 并通过其他 Web 服务将 JSON 响应直接反序列化为 C 对象 这里的问题是元素名称正在更改
  • 使用实体框架从集合中删除项目

    我正在使用DDD 我有一个 Product 类 它是一个聚合根 public class Product IAggregateRoot public virtual ICollection
  • 在 Xcode4 中使用 Boost

    有人设置 C Xcode4 项目来使用 Boost 吗 对于一个简单的 C 控制台应用程序 我需要在 Xcode 中设置哪些设置 Thanks 用这个来管理它 和这个
  • TextBox 焦点的 WinForms 事件?

    我想添加一个偶数TextBox当它有焦点时 我知道我可以用一个简单的方法来做到这一点textbox1 Focus并检查布尔值 但我不想那样做 我想这样做 this tGID Focus new System EventHandler thi
  • 为什么 BOOST_FOREACH 不完全等同于手工编码的?

    From 增强文档 http www boost org doc libs 1 48 0 doc html foreach html foreach introduction what is literal boost foreach li
  • 转到 C# WPF 中的第一页

    我正在 WPF 中使用导航服务 为了导航到页面 我使用 this NavigationService Navigate new MyPage 为了返回我使用 this NavigationService GoBack 但是如何在不使用的情况
  • 为什么 std::allocator 在 C++17 中丢失成员类型/函数?

    一边看着std 分配器 http en cppreference com w cpp memory allocator 我看到成员 value type pointer const pointer reference const refer
  • 两组点之间的最佳匹配

    I ve got two lists of points let s call them L1 P1 x1 y1 Pn xn yn and L2 P 1 x 1 y 1 P n x n y n 我的任务是找到它们点之间的最佳匹配 以最小化它
  • 事件日志写入错误

    很简单 我想向事件日志写入一些内容 protected override void OnStop TODO Add code here to perform any tear down necessary to stop your serv
  • 通过不同 DLL 或 EXE 中的指针或引用访问 STL 对象时发生访问冲突

    我在使用旧版 VC6 时遇到以下问题 我只是无法切换到现代编译器 因为我正在处理遗留代码库 http support microsoft com kb 172396 http support microsoft com kb 172396
  • “MyClass”的类型初始值设定项引发异常

    以下是我的Windows服务代码 当我调试代码时 我收到错误 异常 CSMessageUtility CSDetails 的类型初始值设定项引发异常 using System using System Collections Generic
  • 从匿名类型获取值

    我有一个方法如下 public void MyMethod object obj implement 我这样称呼它 MyMethod new myparam waoww 那么我该如何实施MyMethod 获取 myparam 值 Edit
  • Silverlight Datagrid:在对列进行排序时突出显示整个列

    我的 Silverlight 应用程序中有一个 DataGrid 我想在对该列进行排序时突出显示整个列 它在概念上与上一个问题类似 Silverlight DataGrid 突出显示整列 https stackoverflow com qu
  • 32位PPC rlwinm指令

    我在理解上有点困难rlwinmPPC 汇编指令 旋转左字立即然后与掩码 我正在尝试反转函数的这一部分 rlwinm r3 r3 0 28 28 我已经知道什么了r3 is r3在本例中是一个 4 字节整数 但我不确定这条指令到底是什么rlw
  • 内核开发和 C++ [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 从我know https stackoverflow com questions 580292 what languages are windo
  • 同时从多个流中捕获、最佳方法以及如何减少 CPU 使用率

    我目前正在编写一个应用程序 该应用程序将捕获大量 RTSP 流 在我的例子中为 12 个 并将其显示在 QT 小部件上 当我超过大约 6 7 个流时 问题就会出现 CPU 使用率激增并且出现明显的卡顿 我认为它不是 QT 绘制函数的原因是因
  • 以编程方式使用自定义元素创建网格

    我正在尝试以编程方式创建一个网格 并将自定义控件作为子项附加到网格中 作为 2x2 矩阵中的第 0 行第 0 列 为了让事情变得更棘手 我使用了 MVVM 设计模式 下面是一些代码可以帮助大家理解这个想法 应用程序 xaml cs base
  • WPF/数据集:如何通过 XAML 将相关表中的数据绑定到数据网格列中?

    我正在使用 WPF DataSet 连接到 SQL Server Express XAML 和 C Visual Studio 2013 Express 我从名为 BankNoteBook 的现有 SQL Server Express 数据

随机推荐

  • FirebaseInstanceIdService getToken 返回 null

    我尝试将 FCM 通知添加到我的应用程序中 但出于某种原因 FirebaseInstanceId getInstance getToken 返回 null 由于我没有得到任何堆栈跟踪 我最好的猜测是 FirebaseInstanceIdSe
  • 从 C++ 代码和命令行生成相同的 Key 和 IV

    我的命令行工具 openssl 有问题 或者我的 C 代码有问题 我不知道哪个是不正确的 但是当我使用这两种方法从 passphase 和盐生成密钥和 IV 时 我没有得到相同的密钥 IV 值 您可以看到代码或命令行是否存在任何拼写错误或问
  • 在 foreach 循环中,使用 & 符号或基于键重新分配哪个更好?

    考虑以下 PHP 代码 Method 1 array array 1 2 3 4 5 foreach array as i gt number number array i number print r array Method 2 arr
  • 将 JMeter 报告转换为 JUnit 报告

    如何将 JMeter 报告转换为 JUnit 报告 有些工具 例如 VSTS 知道如何集成 JUnit 报告 但不知道如何集成 JMeter 报告 尽管它们可以运行 JMeter 我创建了一个 XSLT 将 XML JMeter 报告转换为
  • PyMongo Aggregate 如何获取executionStats

    我正在尝试获取特定 mongo 聚合查询的执行统计信息 我运行 db command 但没有给出 执行状态 这就是我正在努力做的事情 如何使用 db command 获取 Python Mongodb Aggregate 解释 https
  • 如何将一个框架分成两部分

    这是俄罗斯方块 玻璃 蓝色 位于左侧 控件 红色面板 位于右侧 换句话说 现在我只想将框架分为两部分 左 较宽 部分是蓝色 右部分是红色 而已 但我似乎没能做到这一点 所以 我的逻辑是 让框架有FlowLayout 然后我添加两个面板 这意
  • POSIX srandom(...) 和 random() 函数的 Windows 等效项?

    我正在尝试将一些代码从 UNIX 移植到 Windows 并且我需要 POSIX 的实现srandom x and random 对于给定的种子函数x 生成与符合 POSIX 1 2001 的编号规则相同的编号规则 Windows 上有哪些
  • 带有 viewPager 的按钮活动?

    请不要评判我 我对 android 开发非常陌生 我想用 viewPager 制作一个应用程序 我有三个具有三种不同布局的页面 但我只是不知道如何处理 viewPager 上第二页上的按钮 我发现了这个问题 如何在viewpager中编写按
  • LinkedHashMap 变量在 foreach 循环之外不可访问

    这是我的代码 var link scala collection mutable LinkedHashMap String String var fieldTypeMapRDD fixedRDD mapPartitionsWithIndex
  • 如何解决legacy-install-failure错误?

    building matplotlib ft2font extension error Microsoft Visual C 14 0 or greater is required Get it with Microsoft C Build
  • 使用 goto 的最佳实践

    使用是否正确goto在这段代码中 还有其他选择吗 return ExecuteReader cmd reader gt List
  • 计算网页上的滚动结束

    我需要计算网页上滚动的结束位置 以便我可以进行 Ajax 调用 我在 stackoverflow 中搜索了帖子 但解决方案对我不起作用 我使用下面的代码来确定 window scrollTop document height window
  • 如何在express + Passport js中删除注销时的cookie?

    我想 删除注销时的cookie 我做不到 我用谷歌搜索答案并找到以下方法 为 cookie 指定新的过期日期 res cookie connect sid expires new Date 1 path 使用以下行删除 cookie res
  • HRESULT 0x80070057 是什么意思?为什么我的程序崩溃了?

    我编写了一个程序 它拍摄两张图像 然后对它们运行一种算法 以隔离 前景 中的一只手 并将手势与已知的手势相匹配 几天前 我使用一些测试参数运行了该程序 只是为了测试我所做的一些调整 一切都运行良好 从那时起我就没有碰过代码 今天 我用两个新
  • 当我们从 s3 中的 csv 文件读取数据并在 aws athena 中创建表时如何跳过标题。

    我正在尝试从 s3 存储桶读取 csv 数据并在 AWS Athena 中创建一个表 我的表在创建时无法跳过 CSV 文件的标题信息 查询示例 CREATE EXTERNAL TABLE IF NOT EXISTS table name e
  • 相对于绝对定位元素的定位 - 有可能吗?

    我在页面上有一些绝对定位的空间 然后在这个空间中有多个绝对定位的元素 效果很好 每当我需要添加另一个元素时 我不必担心页面流量 我只是使用 x y 平面将其放在我想要的位置 我遇到的问题是 现在我在绝对定位元素之一中有一些动态内容 随着它的
  • 如何为具有默认导出的模块编写类型定义

    我想写一个类型定义storybook router https www npmjs com package storybook router 它不必那么准确 因为这是一个次要的开发工具 即anys 是可以接受的 但我什至似乎无法让它发挥作用
  • 输入类型标签属性的有效顺序

    我知道这是非常基本的问题 希望不是那么重要 但我想知道答案 请不要建议仅参考链接 我们每天都会面对
  • laravel 5.2 - 搜索功能

    我希望在我的网站上进行自定义搜索 这是 MySQL 搜索 选择 从MyDB MyTable WHERE id喜欢 MySearch 或firstname喜欢 MySearch 或lastname喜欢 MySearch 或email喜欢 My
  • 有没有办法将外部函数内联到 EF Linq 查询中?

    假设我有一个这样的函数 var filterValue GetCurrentFilter state 然后是 EF 查询 var result context EntitySet Where x gt x column gt filterV