为什么这个 LINQ 表达式会破坏我的循环和转换逻辑?

2023-12-30

背景

ArticleService是一个类,为前端层提供方法,方便与后端业务。

它的两个基本职责是转换 ViewModel(ArticleViewModel)到适当的模型(Article)在保存数据时,反之,在获取数据时将模型转换为 ViewModel...如此频繁,以至于我创建了一个构建 ViewModel 对象的私有方法:

private ArticleViewModel BuildViewModel(Article a)
{
    return new ArticleViewModel { Title = a.Title /* all properties */ }
}

一路前行,ArticleService提供了一种从数据存储中获取所有文章的方法,并将它们作为 ViewModel 返回:public IEnumerable<ArticleViewModel> All()

调用类像这样使用它:var articleViewModels = _articleService.All();

很简单,对吧?

Problem:

我最初写的All()懒洋洋地带着经典foreach loop:

private IEnumerable<ArticleViewModel> All()
{
    var viewModels = new List<ArticleViewModel>();
    foreach (var article in _db.Articles)
        viewModels.Add(BuildViewModel(article));
    return viewModels;
}

效果很好 -articleViewModels是所有视图模型的实例化列表。

接下来,为了性能和美观,我使用 ReSharper 将此循环转换为 LINQ 语句,然后将赋值语句与 return 语句结合起来。结果:

private IEnumerable<ArticleViewModel> All()
{
    return _db.Articles.Select(article => BuildViewModel(article)).ToList();
}

我调试了 LINQ 语句,野兽苏醒了:

LINQ to Entities 无法识别方法“ArticleViewModel” BuildViewModel(Article)' 并且此方法无法转换为存储表达式。

问题 - 为什么这个 LINQ 语句会破坏我的代码?

注意:回到 LINQ 语句的显式声明、赋值、返回,因此我几乎可以肯定这与 lambda 逻辑有关。


问题 - 为什么这个 LINQ 语句会破坏我的代码?

因为 LINQ to Entities 正在尝试翻译BuildViewModel进入 SQL。它不知道怎么办,所以就死得很惨。

在您的原始版本中,您将实体从数据库流式传输到本地盒子,然后使用进行投影BuildViewModel客户端。没关系。

所以我几乎可以肯定这与 lambda 逻辑有关。

没有。这是因为 LINQ to Entities 无法翻译BuildViewModel进入 SQL。是否使用 lambda 表达式来表达投影并不重要。

您可以像这样重写代码:

return _db.Articles.
          .AsEnumerable()
          .Select(article => BuildViewModel(article)).ToList();

这导致_db.Articles被视为普通的旧枚举,然后在客户端进行投影。现在 LINQ to Entities 不必弄清楚要做什么BuildViewModel.

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

为什么这个 LINQ 表达式会破坏我的循环和转换逻辑? 的相关文章

  • HttpResponseMessage 的内容为 JSON

    我有一个 ASP NET MVC WEB API 由于多种原因 由于没有授权而重定向 我不能只使用一个简单的对象并在我的控制器方法中返回它 因此我需要 HttpResponseMessage 类来允许我重定向 目前我正在这样做 var re
  • C 中的分段错误

    我需要用 0 填充二维数组 但编译后的程序会出现此错误 怎么了 int main int vert 1001 1001 int hor 1001 1001 int dudiag 1416 1416 int uddiag 1416 1416
  • 使用 gcc 编译 C 时,预处理的 .i 文件中的数字意味着什么?

    我想了解编译过程 我们可以使用以下命令查看预处理器中间文件 gcc E hello c o hello i or cpp hello c gt hello i 我大致知道预处理器的作用 但我很难理解某些行中的数字 例如 1 usr incl
  • 优化对绑定到 DataGridView 的 DataTable 的更新

    我的应用程序中有一个显示一些数据的表单 当我第一次显示表单时 我将一些数据加载到 DataTable 中 然后将 DataTable 绑定到 DataGridView 我还启动了一个异步方法来执行一些较慢的数据库查询 当这些慢查询完成时 我
  • CMake - 未定义参考

    我正在尝试将 gtest 包含到我的项目中 问题是我在 GTest 中收到未定义的引用错误 我正在尝试在 Gtest 中测试 Node 类 在节点的构造函数中 我使用类记录器 尽管我已将库记录器添加到 gtest target 中 但我仍然
  • 设置外部应用程序焦点

    在 VB NET 中 您可以使用以下命令将焦点设置到外部应用程序 AppActivate Windows Name or AppActivate processID As Integer 现在 如果您这样做 则效果很好 Dim intNot
  • 按位非运算符

    为什么要按位运算 0 打印 1 在二进制中 不是0应该是1 为什么 你实际上很接近 在二进制中 不是0应该是1 是的 当我们谈论一位时 这是绝对正确的 然而 一个int其值为0的实际上是32位全零 将所有 32 个 0 反转为 32 个 1
  • 适用于 Windows 的键值数据库?

    除了 MongoDB 和 Memcached 之外 Windows 上还运行哪些键值存储 我见过的大多数似乎只能在 Linux 上运行 Hypertable Redis Lightcloud 相关链接 是否有经过商业验证的云存储 Key g
  • 在标准库中静态链接时如何支持动态插件?

    假设一个应用程序myapp exe是使用构建的g 它使用标志 static libstdc 这样就可以安装在没有环境的情况下libstdc so myapp exe还添加了对某些功能的插件支持plugf可以通过动态加载dlopen来自共享库
  • 使用 for 循环创建链表

    这是我的结构 struct ListItem int data struct ListItem next 假设链表的第一个节点的 data 0 我想编写一个 for 循环来创建大小为 5 的链表 但我不知道如何工作 我尝试了以下方法 int
  • 锁定文件的一个块

    我有一个大小为 192k 的文件 我想锁定文件的中间部分 例如 我想用 c 锁定文件的 64k 128k 知道如何锁定文件的那部分吗 你需要使用锁定文件Ex http msdn microsoft com en us library win
  • Java 中 LINQ 的等价物是什么? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 Java 中 LINQ 的等价物是什么 没有什么比 LINQ for Java 更好的了 Edit 现在
  • 复杂的 C 声明

    我刚刚在互联网上浏览了一些代码 发现了这个 float foo SIZE SIZE 我如何阅读这份声明 是否有一套特定的规则来阅读如此复杂的声明 我有一段时间没做这个了 从 开始foo然后向右走 float foo SIZE SIZE fo
  • C语言:如何获取使用strtok()一次后剩余的字符串

    我的字符串是 A B C D E 分隔符是 如何获取执行 strtok 一次后剩余的字符串 即 B C D E char a A B C D E char separator char b strtok a separator printf
  • MPI_Gatherv:根数组中收到的垃圾值

    我正在尝试实施MPI Gatherv函数于C 根据我的程序 包括 root 在内的每个进程都应该创建一个大小等于 进程的等级 1 这将在所有单元格中保持进程的等级 然后这个本地数组被收集到根的 rcv array 中 不知何故 我得到了垃圾
  • 在发送传出请求之前将新的 SoapClient 绑定到特定 IP 地址

    假设应用程序所在的计算机具有 SoapClient 具体来说 我正在使用 Microsoft Web Service3 Messaging SoapClient 它通过发送传出请求并获取 SoapEnvelope 作为回报 完善的流程 与远
  • 检测用户是否正在滚动 dataGridView 滚动条

    我正在更新一个dataGridView与一个新的数据表使用 dataGridView1 DataSource table 但是 我不想在用户滚动 dataGridView 时执行此操作 如何检查滚动条是否正在滚动或已完成滚动 即拖动而不是单
  • C# 记录类型:记录子类之间的相等比较

    给定父记录类型 public record Foo string Value 和两个记录子类Bar and Bee我想知道是否可以实施Equals在基类中 因此 Foo Bar 或 Bee 的实例都被考虑equal基于Value 两者都与E
  • 通过 OCI 调用 Oracle 存储过程并使用 C++ 中的 out ref 游标返回结果

    我想使用 OCI 接口从 C 调用 Oracle 存储过程 并使用 out SYS REF CURSOR 作为过程的参数来迭代结果 我是 OCI 新手 所以可能会遗漏一些简单的东西 大部分代码取自这里 我的存储过程是 CREATE OR R
  • Selenium WebDriver 在按钮单击事件上无法正常工作。这里有什么问题呢?

    I am using following code to scrape data from a website I have following interface 这是 HTML div class es content div

随机推荐

  • 如何让“不适当的阻塞方法调用”变得适当?

    我目前正在尝试更多地利用 kotlin 协程 但我面临一个问题 当在这些协程中使用 moshi 或 okhttp 时 我收到警告 不适当的阻塞方法调用 解决这些问题的最佳方法是什么 我真的不想变得不合适 该警告是关于阻止当前线程和协程无法正
  • 从内存缓冲区创建 HBITMAP

    我有一个应用程序 它从数据库中加载一些 blob 数据 这些数据可以表示 png 格式或各种位图和图标的原始二进制数据 这被存储在std vector
  • 重定向到主页而不是 404 错误页面!

    我正在使用 PHP 我有一个如下所示的 htaccess 文件 它重定向到主页而不是 404 错误页面 这里可能有什么问题 赞赏有帮助 多谢 ErrorDocument 404 new err404 html RewriteEngine O
  • Facebook Messenger API - 永久菜单无法在移动设备上运行

    我正在对 API 端点进行 php curl 调用 以根据以下内容设置持久菜单文档 https developers facebook com docs messenger platform thread settings persiste
  • 重新创建 Android 项目后如何合并 Git 存储库?

    我有一个 Android 应用程序 我们称之为 Foo 它有相当多的历史 从 Eclipse 开始 然后迁移到 Android Studio 它曾经具有以下遗留目录结构 Foo MyAndroidLibrary Foo MyAndroidL
  • .NET 6 Core Web 应用程序返回找不到网页

    我已经在这里和其他地方搜索过以找出问题所在 但找不到好的解决方案 我创建了一个针对 NET6 的新 NET Core Web 应用程序 我在没有身份验证且没有 Docker 支持的情况下创建了该项目 我希望新的应用程序能够使用默认登录页面开
  • 调用析构函数,然后调用构造函数(重置对象)

    我想重置一个对象 我可以按照下面的方式来做吗 anObject gt AnObject anObject new anObject AnObject edit this is not allowed anObject gt AnObject
  • 内容重叠div

    我遇到内容重叠的问题 当我尝试这段 HTML 代码时 content left 中的文本与我希望它包含的整个区域重叠 当我将高度更改为自动时 它并不能解决问题 内容向右重叠 底部被切断 wrapper height 1500px margi
  • 使用 Angular-CLI 安装第 3 方 jquery-ui

    我正在为我的 Angular2 项目使用 Angular CLI 在我的项目中我想使用jquery ui 我安装了 jquery ui npm install jquery jquery ui 我编辑了我的 angular cli buil
  • Android 存储访问框架在 asynctask 期间未授予持久权限

    我在这里设置了意图标志 public void createAlbum View view Intent intent new Intent intent setType image intent setAction Intent ACTI
  • 如何在 django 1.10 中使用“unaccent”进行全文搜索?

    我们正在开发一个项目并且我们正在使用Django 1 10a1 我们使用 Django 全文搜索和 PostgreSQL 但我们需要使用非重音符号 所以 我有这个代码 search Car query set Article objects
  • Python 尾随 L 问题

    我正在使用 Python 编写嵌入式系统中内存中特定位置 32 位地址 的一些操作脚本 当我将这些地址与字符串 整数和十六进制值相互转换时 似乎会出现尾随的 L 这可能是一个真正的痛苦 例如以下看似无害的代码将无法工作 int hex 42
  • 如何在 Jasmine 单元测试中使用 Sinon 模拟 jQuery 动画?

    我有一个 1 秒的 jQuery animate页面加载后 5 秒启动的操作 我在 Jasmine 单元测试代码中设置了一个 Sinon 计时器 并在 7 秒后进行测试 看看动画后属性是否符合预期 它无法正常工作 因此我在 Jasmine
  • 创建一个调用 jsf 方法的简单链接

    我正在创建一个注销链接 这是注销 bean 的代码 public void doLogout try FacesContext getCurrentInstance getExternalContext getSessionMap put
  • 在“输入”元素之前或之后生成CSS内容[重复]

    这个问题在这里已经有答案了 在 Firefox 3 和 Google Chrome 8 0 中 以下内容按预期工作 span Test span 但当元素为
  • Java 中的套接字和进程

    在Java中 最好的方法是打开一个持续监听的端口 并且在收到数据包时仍然发送 目前我对网络编程还不是特别精通 所以我在网上找到的教程并不是特别有帮助 将侦听套接字作为服务器套接字并在我用来向服务器发送数据的套接字的单独线程中运行它是否有意义
  • 从静态方法访问非静态成员变量

    我刚刚开始学习 Java 需要一些帮助 我知道我无法对静态方法进行非静态引用 但我需要帮助来解决它 我读到您可以通过创建对象的实例来访问非静态成员变量 但我不确定具体如何操作 这是代码中的一些内容 任何帮助或指示将不胜感激 package
  • 根据 xml 元素的值进行流量控制

    我有一个很长的 xml 数据文件 其中包含 500 多个项目 它的形式如下
  • 如何访问HTML5视频解码功能?

    HTML5 有
  • 为什么这个 LINQ 表达式会破坏我的循环和转换逻辑?

    背景 ArticleService是一个类 为前端层提供方法 方便与后端业务 它的两个基本职责是转换 ViewModel ArticleViewModel 到适当的模型 Article 在保存数据时 反之 在获取数据时将模型转换为 View