带有 poco 生成的实体框架 IQueryable

2023-12-27

我创建了一个 T4 模板,它生成标准实体类及其每个属性的接口,以便我可以制作仅包含我想要的数据的自定义 poco 对象。我还创建了一个复制函数,它可以在实现所述实体接口的任何对象之间进行转换

生成的代码如下所示

//------------------------------------------------------------------------------
// <auto-generated>
//    This code was generated from a template.
//
//    Manual changes to this file may cause unexpected behavior in your application.
//    Manual changes to this file will be overwritten if the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

namespace DomainModel
{
    using System;
    using System.Collections.Generic;
    using System.Linq;


    public interface IRole
    {
    }
    public interface IRole_RoleId : IRole
    {
      int RoleId { get; set; }
    }
    public interface IRole_ApplicationName : IRole
    {
      string ApplicationName { get; set; }
    }
    public interface IRole_RoleName : IRole
    {
      string RoleName { get; set; }
    }
    public interface IRole_Description : IRole
    {
      string Description { get; set; }
    }

    public interface IRole_Users : IRole 
    {
      ICollection<IUser> Users { get; set; }
      IUser NewUsers();
    }

    public interface IRole__All : IRole_RoleId, 
      IRole_ApplicationName, 
      IRole_RoleName, 
      IRole_Description, 
      IRole_Users
    {
    }

    public partial class Role : IRole
    {
      public Role()
      {
        this.Users = new HashSet<User>();
      }

      public int RoleId { get; set; }
      public string ApplicationName { get; set; }
      public string RoleName { get; set; }
      public string Description { get; set; }

      public virtual ICollection<User> Users { get; set; }
    }

    public static class IRoleExt
    {
      public static T CopyTo<T>(this IRole src , T dest = null  )  where T : class, IRole, new()
      {
        dest = dest ?? new T();
        dest.Copy(src);
        return dest;
      }
      public static void Copy(this IRole dest, IRole src)
      {
        var ms = new MergeStack();
        Role role;
        if((role = dest as Role) != null){
          ms.TryCopy<IRole,Role>((indexCopy) => {return indexCopy(role);}, src);
        }
        else if ((role = src as Role) != null){
          ms.TryCopy<Role,IRole>((indexCopy) => {return indexCopy(dest);}, role);
        }
        else{
          ms.TryCopy<IRole,IRole>((indexCopy) => {return indexCopy(dest);}, src);
        }
        dest.Copy(src, ms);
      }

      internal static void Copy(this IRole dest,
        IRole src,
        MergeStack ms)
      {
        dest.Set_RoleId(src.Get_RoleId());
        dest.Set_ApplicationName(src.Get_ApplicationName());
        dest.Set_RoleName(src.Get_RoleName());
        dest.Set_Description(src.Get_Description());
        dest.Set_Users(src.Get_Users(),ms);
      }
        public static Nullable<int> Get_RoleId(this IRole src)
      {
        IRole_RoleId srcIRole_RoleId;
        if((srcIRole_RoleId = src as IRole_RoleId) != null )
        {
          return srcIRole_RoleId.RoleId;
        }
        Role role;
        if((role = src as Role) != null )
        {
          return role.RoleId;
        }
          return null;

      }
        public static void Set_RoleId(this IRole dest, Nullable<int> src)
      {
        IRole_RoleId destIRole_RoleId;
        if((destIRole_RoleId = dest as IRole_RoleId) != null)
        {
           destIRole_RoleId.RoleId = src.GetValueOrDefault();
            }
        Role role;
        if((role = dest as Role) != null )
        {
          role.RoleId = src.GetValueOrDefault();
        }
      }

        public static string Get_ApplicationName(this IRole src)
      {
        IRole_ApplicationName srcIRole_ApplicationName;
        if((srcIRole_ApplicationName = src as IRole_ApplicationName) != null )
        {
          return srcIRole_ApplicationName.ApplicationName;
        }
        Role role;
        if((role = src as Role) != null )
        {
          return role.ApplicationName;
        }
          return null;

      }
        public static void Set_ApplicationName(this IRole dest, string src)
      {
        IRole_ApplicationName destIRole_ApplicationName;
        if((destIRole_ApplicationName = dest as IRole_ApplicationName) != null)
        {
           destIRole_ApplicationName.ApplicationName = src;
            }
        Role role;
        if((role = dest as Role) != null )
        {
          role.ApplicationName = src;
        }
      }

        public static string Get_RoleName(this IRole src)
      {
        IRole_RoleName srcIRole_RoleName;
        if((srcIRole_RoleName = src as IRole_RoleName) != null )
        {
          return srcIRole_RoleName.RoleName;
        }
        Role role;
        if((role = src as Role) != null )
        {
          return role.RoleName;
        }
          return null;

      }
        public static void Set_RoleName(this IRole dest, string src)
      {
        IRole_RoleName destIRole_RoleName;
        if((destIRole_RoleName = dest as IRole_RoleName) != null)
        {
           destIRole_RoleName.RoleName = src;
            }
        Role role;
        if((role = dest as Role) != null )
        {
          role.RoleName = src;
        }
      }

        public static string Get_Description(this IRole src)
      {
        IRole_Description srcIRole_Description;
        if((srcIRole_Description = src as IRole_Description) != null )
        {
          return srcIRole_Description.Description;
        }
        Role role;
        if((role = src as Role) != null )
        {
          return role.Description;
        }
          return null;

      }
        public static void Set_Description(this IRole dest, string src)
      {
        IRole_Description destIRole_Description;
        if((destIRole_Description = dest as IRole_Description) != null)
        {
           destIRole_Description.Description = src;
            }
        Role role;
        if((role = dest as Role) != null )
        {
          role.Description = src;
        }
      }

      public static ICollection<IUser> Get_Users(this Role src)
      {
        return src.Users.Cast<IUser>().ToList();
        }
        public static ICollection<IUser> Get_Users(this IRole src)
      {
        IRole_Users srcIRole_Users;
        if((srcIRole_Users = src as IRole_Users) != null )
        {
          return srcIRole_Users.Users;
        }
        Role role;
        if((role = src as Role) != null )
        {
          return role.Get_Users();
        }
          return null;
      }
      public static void Set_Users(this IRole dest, ICollection<IUser> src)
      {
        var ms = new MergeStack();
        dest.Set_Users(src, ms);
      }

      internal static void Set_Users(this IRole dest, ICollection<IUser> src, MergeStack ms)
      {
        IRole_Users destIRole_Users;
        if((destIRole_Users = dest as IRole_Users) != null)
        {
          Func<IUser,IUser> iToIFunc = (x=> 
              ms.TryCopy<IUser,IUser>((indexCopy)=>
              {
                var ret = destIRole_Users.NewUsers();
                  var exists = indexCopy(ret);
                if(null != exists)
                    ret = exists;
                  else
                  ret.Copy(x,ms);
                return ret;
              },x));
          destIRole_Users.Users = (null !=src)?
          src.Select(iToIFunc).ToList():null;
        }

        Role role;
        if((role = dest as Role) != null)
        {
          Func<IUser,User> iToEFunc = (x=> 
              ms.TryCopy<IUser,User>((indexCopy)=>
              {
                var ret = new User();
                  var exists = indexCopy(ret);
                if(null != exists)
                    ret = exists;
                  else
                  ret.Copy(x,ms);
                return ret;
              },x));
          role.Users = (null !=src)?
          src.Select(iToEFunc).ToList():null;
        }
      }
    }
}

您看到的合并堆栈对象是一个跟踪器,因此我可以处理引用循环。看起来像这样

using System;
using System.Collections.Generic;
using System.Linq;

namespace DomainModel
{

    internal class MergeStack
    {
        private readonly Dictionary<Type, Dictionary<Object, Object>> _mergeObjDict = new Dictionary<Type, Dictionary<object, object>>();
        private readonly IList<Action> _registerActions = new List<Action>();

        public T TryCopy<TKey, T>(Func<Func<T, T>, T> func, TKey key) where T : class
        {
            if (key == null)
                return null;

            Func<T, T> act = (objToIndex) =>
            {
                Dictionary<object, object> objToObj;
                if (!_mergeObjDict.ContainsKey(objToIndex.GetType()))
                {
                    objToObj = new Dictionary<object, object>();
                    _mergeObjDict.Add(objToIndex.GetType(), objToObj);
                }
                else
                {
                    objToObj = _mergeObjDict[objToIndex.GetType()];
                }
                if (!objToObj.ContainsKey(key))
                {
                    objToObj.Add(key, objToIndex);
                }
                else
                {
                    return objToObj[key] as T;
                }
                return null as T;
            };
            return func(act);
        }
    }
}

现在,所有这些都按预期工作正常,它成功地将所有实现的属性复制到域模型/接口或从域模型/接口复制。

我现在正在尝试使用 IQueryable 和延迟加载来玩得更好。

现在我正在做这个

dbContext.Roles.Select((x)=> x.CopyTo<RolesPoco>());

我想看看是否有一种方法可以自动生成包含内容,例如

dbContext.Roles.Select((x)=> x.Users.Include((y)=> y.someSubEntity);

我还想看看是否可以添加一些像这样的 where 子句

//the first string is a path so something like "Roles.Users.someSubEntity"
//the second string is a IQueryable function like Where or Take
Dictionary<String,Dictionary<String,List<Func<T, IQueryable<TProperty>>>> queryDict

dbContext.Roles.Select((x)=> x.CopyTo<RolesPoco>(queryDict)

然后列表将是一些可以在包含函数内部运行的 lambda 列表。 有人对此有什么想法吗?

Edit:我重构简化了一些代码,以便即使该类没有实现该接口,它也可以调用 getter/setter。因此,无论是否存在支持字段,都可以访问属性。如果未定义则返回 null。

Edit2: 由于似乎不清楚我想要实现什么,让我澄清一下。如果你继续阅读本文的备注部分msdn页面 http://msdn.microsoft.com/en-us/library/gg671236%28v=vs.103%29.aspx,你会看到一些选择语句。我想生成这些表达式,然后根据要复制到的类是否包含实现该成员的接口在父选择内部使用它们。我避免使用 linqToObject,因为我只需要 CopyTo 中定义的属性,但导航属性是接口,这会破坏实体框架。这是为了延迟加载的目的。 MergeStack 将在树上组合并返回这些表达式。我的想法来自DaedTech 博客文章 http://www.daedtech.com/faking-an-interface-mapping-in-entity-framework


Roles 是 IQueryable 的,因此您需要从 Queryable 扩展类中获取 Select 方法。 您还需要从 Enumerable 扩展类中获取 Include。 然后,您需要使用 Role 作为通用参数来调用 Select 方法。 您需要使用 Expression.Lambda、Expression.Call 和 Expression.Property 构造 lambda。

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

带有 poco 生成的实体框架 IQueryable 的相关文章

  • 数据结构的优化存储以实现快速查找和持久化

    Scenario 我有以下方法 public void AddItemSecurity int itemId int userIds public int GetValidItemIds int userId 最初我正在考虑表单上的存储 i
  • ASP.NET 会员电子邮件验证

    尝试基于 C 创建电子邮件验证本文 https web archive org web 20211020153319 https www 4guysfromrolla com articles 062508 1 aspx 我创建了一个 ja
  • 将列表数组中的值绑定到列表框

    任何机构都可以给出一个简短的示例 用于将列表数组中的值绑定到 c net 中的列表框 这取决于您的列表数组的情况 让我们从一个简单的示例开始 List
  • 是否可以通过引用以基类作为参数的函数来传递派生类

    假设我们有一个抽象基类IBase使用纯虚方法 接口 然后我们推导出CFoo CFoo2来自基类 我们有一个知道如何使用 IBase 的函数 Foo IBase input 这些情况下通常的场景是这样的 IBase ptr static ca
  • 不能使用函数名称距离

    以下代码可以正常编译 include
  • ASP.NET Core 中 AsNoTracking 的模拟或更好的解决方法

    您如何模拟 AsNoTracking 或者是否有更好的解决方法来解决此问题 Example public class MyContext MyContextBase Constructor public MyContext DbContex
  • MSVC10 /MP 在项目中跨文件夹构建非多核

    我希望有人指出我们所遇到的错误或解决方法 使用 MP 编译项目时 似乎仅同时编译同一文件夹中的文件 我使用进程资源管理器来滑动命令行并确认行为 项目过滤器似乎对同时编译的内容没有影响 项目结构disk Folder project vcxp
  • std::async 参数的生命周期是多少?

    看来函数的参数是通过std async分享未来的生活 include
  • 如何实现可变虚拟成员函数

    所以我有这个功能 virtual void CallRemoteFunction const char pServerGameObjectId const char pFunctionName OVariant arg1 OVariant
  • 为什么我在这段代码中不断得到两个相同的随机值? [复制]

    这个问题在这里已经有答案了 可能的重复 为什么我的随机数生成器在 C 中不是随机的 https stackoverflow com questions 932520 why does it appear that my random num
  • C++ 虚拟关键字与重写函数

    我正在学习c 并且正在学习virtual关键字 我在互联网上搜索试图理解它但无济于事 我进入编辑器并做了以下实验 期望它打印两次基本消息 因为我的印象是需要 virtual 关键字来覆盖函数 然而 它打印出了两条不同的消息 有人可以向我解释
  • 使用 C# 和 .NET Core 在 AWS Cognito 用户池中进行用户管理

    如何使用 C 和 NET Core 3 x 管理 AWS Cognito 用户池中的用户 在文档中找不到有关它的任何内容 Attilio Gelosa 的原创文章 我写这篇文章是希望对其他人有帮助 我必须阅读一页又一页的文档 并从 AWS
  • 为什么 C++20 范围不只提供管道语法?

    我知道这个问题听起来很奇怪 所以这里有一些背景信息 最近 我很失望地了解到 C 20 范围内的映射缩减并不像人们所期望的那样工作 即 const double val data transform accumulate 不起作用 你必须这样
  • C# 或 Windows 相当于 OS X 的 Core Data?

    我迟到了 现在才开始在 OS X Cocoa 中使用 Core Data 它令人难以置信 并且确实改变了我看待事物的方式 C 或现代 Windows 框架中是否有等效的技术 即拥有可免费保存 数据管理 删除 搜索的托管数据类型 还想知道Li
  • EF 5.0 枚举未生成

    背景我在安装了 Net 4 5 的机器上使用 VS 2010 我读到这是就地安装 覆盖了 net 4 0 版本 我的项目仍然针对 4 0 而 4 5 选项不可用 但被告知没关系 因为 4 5 是就地安装 然后 我通过 nuget 安装了 E
  • 更改成员资格、角色等的默认连接字符串

    默认情况下 我的网络应用程序似乎正在使用LocalSqlServer作为用于任何应用程序服务 例如成员资格 角色 身份验证 等 的连接字符串 有什么方法可以更改默认连接字符串应该是什么 默认值是 LocalSqlServer 似乎很随意 我
  • 使用 Node.js 访问用 C++ 编写的 SDK

    我有一个用 C 语言编写的 SDK 可以与我的扫描仪设备进行通信 我需要开发一个可以访问扫描仪设备的电子应用程序 我知道有很多库可用于扫描仪 但我想使用这个 SDK 因为它允许我访问设备的完整功能 而且它是由设备制造商提供的 那么 有没有什
  • std::iota 的 iota 代表什么?

    我假设 i 是增量 a 是分配 但我无法弄清楚或找到答案 而且 它看起来与非标准非常相似itoa我认为这很令人困惑 C iota is not an acronym or an initialism It is the word iota
  • 您的 C++ 程序中是否仍然存在内存分配失败问题 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我正在为公司写一些指导方针 我需要回答一些棘手的问题 这一项是相当困难的 解决方案可以是 根本不跟踪 确保使用 new 分配对象 这会在分配失败
  • File.Move 的原子性

    我想将目录中的文件重命名为原子事务 该文件不会更改目录 该路径作为 NTFS 文件系统的 UNC 路径提供 可能位于服务器 03 或 08 上 File Move 对于这些目的来说是原子的吗 例如 它要么成功完成 要么失败 以使原始文件仍然

随机推荐

  • Antlr4 解析异常

    我正在使用 Antlr4 解析语法并遇到一个我无法理解的问题 简而言之 问题是 Antlr4 解析器无法完全解析我原始语法中的测试字符串 但是当我添加多余的规则时 解析就完成了 我提供了语法的简化版本来说明这个问题 grammar my s
  • 从firebase中检索除某些字段之外的所有数据

    我正在开发一个使用 Angular Firebase 和云函数的项目 我的数据如下 我想检索除 profile picture 字段之外的所有数据 在云函数中 exports getPartner functions https onReq
  • 您知道如何在 Databricks 集群上安装“ODBC Driver 17 for SQL Server”吗?

    我正在尝试使用 pyodbc python 库从 Databricks 笔记本连接到 Azure SQL 数据仓库 当我执行代码时 我收到此错误 Error 01000 01000 unixODBC Driver Manager Can t
  • 如果它在本地堆上分配,为什么称为 Marshal.AllocHGlobal?

    来自 MSDN 文档Marshal AllocHGlobal http msdn microsoft com en us library s69bkh17 aspx AllocHGlobal 是 Marshal 类中的两种内存分配方法之一
  • 如何从同步代码Python调用异步函数

    所以我被锁定在我的桌面应用程序之后的 python 3 6 2 解释器上 我想要的是从同步方法或函数调用异步函数 当从桌面应用程序调用 python 函数时 它必须是一个不能等待的普通函数 从桌面应用程序中 我可以发送 url 列表 而我想
  • 使用多个数据库模式的 JPA

    我在使用 JPA Spring 时遇到了一个特定问题 如何动态地将模式分配给实体 我们有属于模式 AD 的 TABLE1 和属于 BD 的 TABLE2 Entity Table name TABLE1 schema S1D Entity
  • Python脚本与linux shell交互

    我有一个 Python 脚本 需要通过命令行与用户交互 同时记录输出的任何内容 我目前有这个 lots of code popen subprocess Popen args shell True stdin sys stdin stdou
  • R 工作区,即 .R 文件

    如何在新会话中为该会话中的新对象启动新的 R 文件默认值 工作空间是 RData 文件 而不是 R 文件 R 文件是源文件 即包含代码的文本文件 这有点棘手 如果保存了工作区 则 R 会在当前工作目录中保存两个文件 一个包含对象的 RDat
  • 向URL二维码添加数据?

    是否可以创建一个包含 URL 数据 数字 的 QR 码 我可以从自己的应用程序中对其进行解码 另外 我需要它的方式是 如果有人尝试从常规 QR 扫描仪扫描它 它只会定向到 URL 我正在应用程序上读取二维码卡来读取数据 不同位置的卡很少 因
  • React useEffect 清理函数运行多次?

    React hook noob在这里 鉴于这个例子 useEffect gt function handleStatusChange status setIsOnline status isOnline ChatAPI subscribeT
  • Jersey 多部分客户端上传

    我设计了一个多部分 Jersey REST 服务 如下所示 用于接收多部分请求 文件上传 并将文件保存在磁盘位置 POST Path Upload Produces MediaType TEXT HTML Consumes MediaTyp
  • 根据一列值对子数组数据进行分组和合并

    我在下面的 PHP 代码中有一个数组 我想将该数组转换为按数据值分组 简化数组总是很困难 原始数组 array date gt 2017 08 22 AAA gt 1231 date gt 2017 08 21 AAA gt 1172 da
  • 从表单发送电子邮件(仅限 HTML、javascript)

    从表单发送电子邮件 以下是基本 HTML 代码的链接 W3学校 http www w3schools com html tryit asp filename tryhtml form mail 写完评论 姓名和电子邮件并单击 发送 按钮后
  • 如何完全重置警告

    如何在不重新启动 python 的情况下再次看到警告 现在我只见到他们一次 例如考虑以下代码 import pandas as pd pd Series 1 0 I get RuntimeWarning divide by zero enc
  • 将整个二进制文件读入 Python

    我需要从 Python 导入一个二进制文件 内容是有符号的 16 位整数 大端字节序 以下堆栈溢出问题建议如何一次提取多个字节 但这是否是扩展以读取整个文件的方法 在Python中读取一些二进制文件 https stackoverflow
  • Grails——服务层的使用

    当我想要更新非简单域对象时 我在组织代码时遇到问题 问题在于分离控制器和服务层的职责 更明确地说 假设我们有一个域类 Client 它依赖于其他域类 如 Address 等 在视图中 有一个 gsp 用于编辑一些客户端属性 包括一些嵌套属性
  • 两个“np.longdouble”的总和会产生很大的数值误差

    早上好 我正在从 FITS 文件中读取两个数字 表示单个数字的整数和浮点部分 将它们转换为长双精度数 在我的机器中为 128 位 然后将它们相加 使用 128 位浮点数得到的结果并不像我预期的那么精确 这是代码 a int np longd
  • 错误:redirect_uri_mismatch 在 MVC 应用程序的 Google 登录中

    我正在尝试通过 MVC C 应用程序将视频上 传到 YouTube 我正在关注这个link https github com youtube api samples tree master dotnet 每当我尝试运行该应用程序时 我都会收
  • Android MediaCodec:多个 SurfaceView 支持多少个同步(视频)解码线程?

    From Grafika https github com google grafika项目 文件 DoubleDecodeActivity java 我在 3 个 SurfaceView 上使用 MediaCodec API 尝试了 3
  • 带有 poco 生成的实体框架 IQueryable

    我创建了一个 T4 模板 它生成标准实体类及其每个属性的接口 以便我可以制作仅包含我想要的数据的自定义 poco 对象 我还创建了一个复制函数 它可以在实现所述实体接口的任何对象之间进行转换 生成的代码如下所示