提供基于泛型类型集合的泛型键比较

2023-12-19

我已经创建了自己的InsertOrUpdate()一些类型的实现如下:

public IEnumerable<Genre> InsertOrUpdate(IEnumerable<Genre> genres)
{
    foreach (var genre in genres)
    {
        var existingGenre = _context.Genres.SingleOrDefault(x => x.TmdbId == genre.TmdbId);
        if (existingGenre != null)
        {
            existingGenre.Update(genre);
            yield return existingGenre;
        }
        else
        {
            _context.Genres.Add(genre);
            yield return genre;
        }
    }
    _context.SaveChanges();
}

返回类型为IEnumerable<T>是必需的,因为它将用于在数据上下文中插入根对象。此方法基本上检索附加对象(如果存在)并使用最新值更新它(如果存在)或将其作为新对象插入(如果不存在)。然后,返回此附加对象,以便它可以链接到多对多表中的根对象。

现在的问题是我有几个这样的集合(流派、海报、关键字等),并且每种类型的 ID 设置不同:有时它被称为TmdbId, 有时Id有时Iso。使用接口并将它们全部重命名是一回事Id但问题在于它们也是不同的类型:有些是int有些是string.

问题很简单:我如何将其变成更通用的东西以避免代码重复?

到目前为止我一直在玩弄

public IEnumerable<T> InsertOrUpdate<T>(IEnumerable<T> entities, Func<T, bool> idExpression) where T : class 
{
    foreach (var entity in entities)
    {
        var existingEntity = _context.Set<T>().SingleOrDefault(idExpression);
        if (existingEntity != null)
        {
            _context.Entry(existingEntity).CurrentValues.SetValues(entity);
            yield return existingEntity;
        }
        else
        {
            _context.Set<T>().Add(entity);
            yield return entity;
        }
    }
    _context.SaveChanges();
}

但显然这行不通,因为我无法访问内部entity多变的。边注:IDbSet<T>().AddOrUpdate() 在我的场景中不起作用 https://entityframework.codeplex.com/workitem/2128.


你可以尝试:

public IEnumerable<T> InsertOrUpdate<T>(IEnumerable<T> entities, Func<T, object[]> idExpression) where T : class

and

var existingEntity = _context.Set<T>().Find(idExpression(entity));

用类似的东西调用

movie.Genres = new List<Genre>(InsertOrUpdate(movie.Genres, x => new object[] { x.Id }));

(请注意,返回一个方法IEnumerable<> is very危险...如果你不列举它,就像

InsertOrUpdate(movie.Genres, x => x.Id);

那么该方法将不会完全执行,因为它将“按需”延迟执行)

如果只有单键表,可以将其更改为:

public IEnumerable<T> InsertOrUpdate<T>(IEnumerable<T> entities, Func<T, object> idExpression) where T : class

and

var existingEntity = _context.Set<T>().Find(new object[] { idExpression(entity) });

and

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

提供基于泛型类型集合的泛型键比较 的相关文章

随机推荐

  • loadClass(字符串名称)和loadClass(字符串名称,布尔解析)之间的区别

    有什么区别loadClass String name http download oracle com javase 1 3 docs api java lang ClassLoader html loadClass 28java lang
  • 列出给定 Azure 帐户的订阅

    我正在尝试使用以下命令列出 Azure 帐户中的订阅azure python sdk 我已点击文档中的此链接 https learn microsoft com en us python api azure mgmt subscriptio
  • NHibernate 组件继承

    NHibernates 组件可以继承吗 快速谷歌只返回了一堆适当的结果 所有博客 并且所有内容都是前一段时间写的 所以想知道它是否可用 如果不是 你该如何处理 目前还不可能 如果需要继承 则必须映射一个实体
  • 在实体框架中绑定自定义属性

    我的 EF 模型中有一个员工实体 然后我向项目添加了一个类以添加自定义属性 public partial class Employee public string Name get return string Format 0 1 this
  • 如何缩小 IMG 周围的 DIV?

    向所有 CSS 大师提出一个简单的 有人可能会想 问题 我想缩小 DIVsnugly围绕 IMG IMG 是 600 x 800 我需要它小得多 所以我去 高度 100 width auto 并通过包装器 DIV 约束高度 但是 为了维持
  • 在 Android 项目中处理 AWS 凭证的正确方法是什么?

    我需要在我的 Android 应用程序中连接到 Amazon 的 SimpleDB 亚马逊提供的示例项目安卓软件开发工具包 http aws amazon com sdkforandroid 将凭证放置在名为 AwsCredentials
  • 如何动态更改 ElasticSearch 的同义词

    我的同义词存储在数据库中 当数据库中的同义词发生更改时 我想更新索引中可能因同义词更改而更改的任何值 我能想到的有两个部分 第一 找出要重新索引的文档 第二 弄清楚如何告诉 ElasticSearch 同义词已更改 我正在努力解决第二个问题
  • 在 C# 中用新音频覆盖 mp4/wmv 视频的音频内容

    我有一个视频剪辑和一个音频剪辑 我想将音频放在视频的一部分上 双方的起点一致 但视频稍长 我想最好用 C 来做到这一点 有人知道我该怎么做吗 我想批量处理大量短片 10 12 分钟的剪辑 因此需要将其写入代码中 谢谢您的帮助 egon 您的
  • 我可以从应用程序内启动系统 PIN 身份验证吗?

    是否可以在我的应用程序中创建身份验证 以使用设备锁定 PIN 码验证用户 是否有意图机制或类似机制提示用户输入 PIN 码 我见过DevicePolicyManager 但我无法想出 有什么结论吗 从Android 5 0开始 您可以使用K
  • Rails Devise CakePHP 的旧用户

    我最近让 Devise 开始工作 新用户登录 注册 注销等都很好 然而 老用户有一个问题 我已经得到了 401 未经授权的地步 在我看来 登录时创建的哈希值不正确 当然也没有正确匹配 我的用户模型 class User lt ActiveR
  • 使用 Maven 和 postgres-db 运行 liquibase 时出现问题

    我在 postgresql db 上运行 Maven 的 liquibase plugin 时遇到问题 当尝试从命令行运行 liquibase update 时 我收到错误消息 ERROR Failed to execute goal or
  • 代码签名错误:捆绑包格式无法识别、无效或不合适

    我正在开发 iOS 应用程序 Swift 语言 iOS8 Xcode 6 1 它在 iPad 上运行良好 然后我向项目添加了 资源 文件夹引用 之后我收到代码签名错误 Resource 文件夹包含一些 HTML 文件 我不确定此文件夹引用是
  • 为什么当我第一次在系统中运行 React js 项目时收到此错误消息?

    当我跑步时npm start 我收到此错误消息 来自 chokidar C 的错误 错误 EBUSY 资源繁忙或锁定 lstat C hiberfil sys 来自 chokidar C 的错误 错误 EBUSY 资源繁忙或锁定 lstat
  • Intellij:如何复制/粘贴文件以复制它?

    我似乎找不到办法做到这一点 我在某个文件夹中有一个名为 X 的文件 我想在同一目录中创建具有相同内容的 Y 我在eclipse中的做法是选择文件并 C P eclipse提示输入新名称 UPDATE 显然 只有当编译单元包含多个类型时才会出
  • 您如何看待 TFS 中版本的更改?

    我正在尝试从 VSS 迁移到 TFS 并且需要能够显示在两个版本之间签入了哪些文件 在 VSS 中 我们只需标记发布的代码并查看标签之间的历史记录 并生成报告以显示签入和评论 有没有办法用 TFS 获得类似的结果 或者显示两个变更集或标签之
  • ATLANTBH jmeter-components:JSON 路径断言

    我正在尝试使用执行 JSON 断言ATLANTBH https github com ATLANTBH jmeter componentsjmeter JSON 路径断言 但是 我似乎无法编写正确的表达式来从下面发布的 JSON 提要中获取
  • Android - 使用 Glide/Picasso 从网站 URL 加载缩略图

    我正在尝试使用 Glide 加载网络上一篇文章的缩略图 但它返回一个空字段 与其他示例不同 此 URL 不直接链接到 PNG JPG 等等 而是一个网站链接 我需要它加载 默认缩略图 ImageView 已正确设置并初始化 我曾分别尝试过使
  • jQuery 可拖放定位

    我正在使用 jquery UI 和 jQuerydraggable 我所有的draggables都使用jqueryclone助手并附加可拖动的 to 可丢弃的 这是我的代码 squeezePage droppable droppable t
  • 如何检查是否安装了 gem?

    我为 Sinatra 项目安装了 data mapper 好奇 为什么我这样做的时候会这样gem install brew I can which brew并获取其位置的路径 但不能用于 data mapper 这适用于某些宝石 但不适用于
  • 提供基于泛型类型集合的泛型键比较

    我已经创建了自己的InsertOrUpdate 一些类型的实现如下 public IEnumerable