为什么这个 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 表达式会破坏我的循环和转换逻辑? 的相关文章

  • 如何将 std::string& 转换为 C# 引用字符串

    我正在尝试将 C 函数转换为std string参考C 我的 API 如下所示 void GetStringDemo std string str 理想情况下 我希望在 C 中看到类似的东西 void GetStringDemoWrap r
  • 在 xaml 中编写嵌套类型时出现设计时错误

    我创建了一个用户控件 它接受枚举类型并将该枚举的值分配给该用户控件中的 ComboBox 控件 很简单 我在数据模板中使用此用户控件 当出现嵌套类型时 问题就来了 我使用这个符号来指定 EnumType x Type myNamespace
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • 从经典 ASP 调用 .Net C# DLL 方法

    我正在开发一个经典的 asp 项目 该项目需要将字符串发送到 DLL DLL 会将其序列化并发送到 Zebra 热敏打印机 我已经构建了我的 DLL 并使用它注册了regasm其次是 代码库这使得 IIS 能够识别它 虽然我可以设置我的对象
  • 需要帮助优化算法 - 两百万以下所有素数的总和

    我正在尝试做一个欧拉计划 http projecteuler net问题 我正在寻找 2 000 000 以下所有素数的总和 这就是我所拥有的 int main int argc char argv unsigned long int su
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例
  • ASP.NET Core 3.1登录后如何获取用户信息

    我试图在登录 ASP NET Core 3 1 后获取用户信息 如姓名 电子邮件 id 等信息 这是我在登录操作中的代码 var claims new List
  • 如何获取 EF 中与组合(键/值)列表匹配的记录?

    我有一个数据库表 其中包含每个用户 年份组合的记录 如何使用 EF 和用户 ID 年份组合列表从数据库获取数据 组合示例 UserId Year 1 2015 1 2016 1 2018 12 2016 12 2019 3 2015 91
  • x:将 ViewModel 方法绑定到 DataTemplate 内的事件

    我基本上问同样的问题这个人 https stackoverflow com questions 10752448 binding to viewmodels property from a template 但在较新的背景下x Bind V
  • 为什么 C# 2.0 之后没有 ISO 或 ECMA 标准化?

    我已经开始学习 C 并正在寻找标准规范 但发现大于 2 0 的 C 版本并未由 ISO 或 ECMA 标准化 或者是我从 Wikipedia 收集到的 这有什么原因吗 因为编写 审查 验证 发布 处理反馈 修订 重新发布等复杂的规范文档需要
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • 实例化类时重写虚拟方法

    我有一个带有一些虚函数的类 让我们假设这是其中之一 public class AClassWhatever protected virtual string DoAThingToAString string inputString retu
  • 如何在 Linq to SQL 中使用distinct 和 group by

    我正在尝试将以下 sql 转换为 Linq 2 SQL select groupId count distinct userId from processroundissueinstance group by groupId 这是我的代码
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • C# 中最小化字符串长度

    我想减少字符串的长度 喜欢 这串 string foo Lorem ipsum dolor sit amet consectetur adipiscing elit Aenean in vehicula nulla Phasellus li
  • C# 使用“?” if else 语句设置值这叫什么

    嘿 我刚刚看到以下声明 return name null name NA 我只是想知道这在 NET 中叫什么 是吗 代表即然后执行此操作 这是一个俗称的 条件运算符 三元运算符 http en wikipedia org wiki Tern
  • DotNetZip:如何提取文件,但忽略zip文件中的路径?

    尝试将文件提取到给定文件夹 忽略 zip 文件中的路径 但似乎没有办法 考虑到其中实现的所有其他好东西 这似乎是一个相当基本的要求 我缺少什么 代码是 using Ionic Zip ZipFile zf Ionic Zip ZipFile
  • 指针和内存范围

    我已经用 C 语言编程有一段时间了 但对 C 语言还是很陌生 有时我对 C 处理内存的方式感到困惑 考虑以下有效的 C 代码片段 const char string void where is this pointer variable l

随机推荐

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

    我目前正在尝试更多地利用 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