访问表达式树中与子项(列表)相关的属性

2024-02-14

我为我的实体创建了一个存储库Master。在存储库中,我有一个Get使用 Entity Core 通过 Id 获取实体的方法。

该方法接收:

public TEntity Get(object id, params Expression<Func<TEntity, object>>[] includedRelatedEntities)
    {
        return GetById(IncludeEntities(DBContext.Set<TEntity>().AsQueryable(), includedRelatedEntities), id);
    }

然后,当我在代码中使用它时,我只需将我正在查找的实体的 id 以及我需要包含在查询中的相关实体的表达式树传递给该方法(Expression<Func<TEntity, object>>)

使用示例如下:

var master = MasterRepository.Get(1, x => x.BranchOffice.Location);

在这种情况下,我正在寻找 Id = 1 的 Master,并且我希望它包括BranchOffice相关实体及Location与此相关BranchOffice.

从一个到多个关系,它工作得很好,但是对于相关列表,我不知道如何使用表达式来解决它。

例如,如果我想包括Product列表的实体Detail named Details与我有关Master,不知道如何在表达式树中表达。

var master = MasterRepository.Get(1, x => x.Details.Product);

详细信息是一个列表,因此我无法像上面的示例中那样访问产品。

我该如何表达这一点Expression<Func<TEntity, object>>?

EDIT:

我已经尝试过:

var master = MasterRepository.Get(1, x => x.Details.Select(y=> y.Product));

但我遇到以下异常:

属性表达式 'x => {from Detail y in [x].Details select [y].Product}' 无效。表达式应该代表一个属性 访问:'t => t.MyProperty'。有关包含相关内容的更多信息 数据,请参阅 go.microsoft.com/fwlink/?LinkID=746393。


我不知道你能改变或更换吗IncludeEntities实现,所以也许答案对你没有帮助。出色地,x => x.Details.Product将看起来像这样DbContext.Set<SomeType>().Include(x => x.Details).ThenInclude(o => o.Product) in the EF.Core.

因此,如果您想包含多个级别,我可以建议您在运行时构建一个查询,其中包含Include and ThenInclude。因此,该查询将根据输入表达式构建,如下所示x => x.Details.Select(y => y.Product)。它是构建此查询的方法:

    /// <summary>
    /// Takes include looks like 'x => x.Collections.Select(o => o.List.Select(p => p.Date))'
    /// </summary>
    public static IQueryable<T> GetQueryWithIncludes<T>(IQueryable<T> query, Expression<Func<T, object>> arg)
    {
        // Tiny optimization
        ParameterInfo[] parameters;
        var includeInfo = typeof(EntityFrameworkQueryableExtensions).GetMethods().Where(info => info.Name == "Include" &&
            (parameters = info.GetParameters()).Length == 2 &&
            typeof(Expression).IsAssignableFrom(parameters[1].ParameterType)).Single();

        // Retrieve then include that take first param as 'IIncludableQueryable<TEntity, ICollection<TPreviousProperty>>'
        var thenIncludeInfo = typeof(EntityFrameworkQueryableExtensions).GetMethods().Where(info => info.Name == "ThenInclude").ToList()[1];
        // Retrieve then include that take first param as 'IIncludableQueryable<TEntity, IEnumerable<TPreviousProperty>>'
        var lastThenIncludeInfo = typeof(EntityFrameworkQueryableExtensions).GetMethods().Where(info => info.Name == "ThenInclude").ToList()[0];

        // Retrieve all selection from input expression
        var lambda = arg as LambdaExpression;
        var method = arg.Body as MethodCallExpression;
        var result = new List<Expression>();
        while (method != null)
        {
            result.Add(Expression.Lambda(method.Arguments[0], lambda.Parameters[0]));
            lambda = method.Arguments[1] as LambdaExpression;
            method = lambda.Body as MethodCallExpression;
        }
        result.Add(lambda);

        // Add Include and ThenInclude to IQueryable
        for (int i = 0; i < result.Count; ++i)
        {
            var lambdaExp = result[i] as LambdaExpression;
            query = i == 0
                ? includeInfo.MakeGenericMethod(lambdaExp.Parameters[0].Type, lambdaExp.ReturnType).Invoke(null, new object[] { query, lambdaExp }) as IQueryable<T>
                : i == result.Count - 1
                    ? lastThenIncludeInfo.MakeGenericMethod((result[0] as LambdaExpression).Parameters[0].Type, lambdaExp.Parameters[0].Type, lambdaExp.ReturnType).Invoke(null, new object[] { query, lambdaExp }) as IQueryable<T>
                    : thenIncludeInfo.MakeGenericMethod((result[0] as LambdaExpression).Parameters[0].Type, lambdaExp.Parameters[0].Type, lambdaExp.ReturnType).Invoke(null, new object[] { query, lambdaExp }) as IQueryable<T>;
        }
        return query;
    }

顺便说一句,方法采​​用一个表达式,但可以对其进行轻微修改,因此它将采用表达式数组,或者您可以直接从所有表达式的循环中调用该方法。

下面的代码只是用法。我写了一个树小类来测试:

    public class Test
    {
        public int Id { get; set; }
        public DateTime TestDate { get; set; }
        public ICollection<Level> Levels { get; set; }
    }

    public class Level
    {
        public int Id { get; set; }
        public ICollection<LevelDetail> LevelDetails { get; set; }
    }

    public class LevelDetail
    {
        public int Id { get; set; }
        public DateTime LevelDate { get; set; }
    }

    ...
    // These results are the same and have the same expression trees
    var resultByInclude = context.Tests
        .Include(o => o.Levels)
        .ThenInclude(p => p.LevelDetails).ToList();

    var resultBySelect = GetQueryWithIncludes(context.Tests,
        o => o.Levels.Select(p => p.LevelDetails)).ToList();

我希望它能帮助你。

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

访问表达式树中与子项(列表)相关的属性 的相关文章

  • 在 CPP 类中将 C 函数声明为友元

    我需要在 C 函数中使用类的私有变量 我正在做这样的事情 class Helper private std string name public std getName return name friend extern C void in
  • 如何在类文件中使用 Url.Action() ?

    如何在 MVC 项目的类文件中使用 Url Action Like namespace 3harf public class myFunction public static void CheckUserAdminPanelPermissi
  • MVC3中设置下拉列表中的所选项目

    我必须为视图中的下拉列表设置所选项目 但它不起作用 View div class editor label Html LabelFor model gt model Gender div div class editor field Htm
  • 未找到 Boost 库,但编译正常

    我正在尝试在 C 中使用 boost 的文件系统 使用时看起来编译没问题 c c Analyse c o Analyse o g W Wall L usr local lib lboost filesystem lboost system
  • 当事件button.click发生时,如何获取按钮名称/标签?

    我以编程方式制作按钮并将它们添加到堆栈面板中 以便每次用户导航到页面时按钮都会发生变化 我正在尝试做这样的事情 当我单击创建的按钮时 它将获取按钮的标签并转到正确的页面 但是 我无法使用 RoutedEventHandler 访问按钮元素
  • java中如何重新初始化int数组

    class PassingRefByVal static void Change int pArray pArray 0 888 This change affects the original element pArray new int
  • 强制初始化模板类的静态数据成员

    关于模板类的静态数据成员未初始化存在一些问题 不幸的是 这些都没有能够帮助我解决我的具体问题的答案 我有一个模板类 它有一个静态数据成员 必须为特定类型显式实例化 即必须专门化 如果不是这种情况 使用不同的模板函数应该会导致链接器错误 这是
  • 不同 C++ 文件中的相同类名

    如果两个 C 文件具有相同名称的类的不同定义 那么当它们被编译和链接时 即使没有警告也会抛出一些东西 例如 a cc class Student public std string foo return A void foo a Stude
  • 如何使用 ASP.NET Core 获取其他用户的声明

    我仍在学习 ASP NET Core 的身份 我正在进行基于声明的令牌授权 大多数示例都是关于 当前 登录用户的 就我而言 我的 RPC 服务正在接收身份数据库中某个用户的用户名和密码 我需要 验证是否存在具有此类凭据的用户 获取该用户的所
  • 在 C# 中检查 PowerShell 执行策略的最佳方法是什么?

    当你跑步时Get ExecutionPolicy在 PowerShell 中 它得到有效的执行政策 https learn microsoft com en us powershell module microsoft powershell
  • 如何使用 x64 运行 cl?

    我遇到了和这里同样的问题致命错误 C1034 windows h 未设置包含路径 https stackoverflow com questions 931652 fatal error c1034 windows h no include
  • 是否使用 C# 数据集? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我对 C 中的数据集概念有点困惑 编码 ASP NET 站点 但这并不重要 在我的阅读中 我了解到它们 本质上 用作我的应用程序和我的
  • 从 C# 使用 Odbc 调用 Oracle 包函数

    我在 Oracle 包中定义了一个函数 CREATE OR REPLACE PACKAGE BODY TESTUSER TESTPKG as FUNCTION testfunc n IN NUMBER RETURN NUMBER as be
  • 将 Word 转换为 PDF - 禁用“保存”对话框

    我有一个用 C 编写的 Word 到 PDF 转换器 除了一件事之外 它工作得很好 有时 在某些 Word 文件上 后台会出现一条消息保存源文件中的更改 gt 是 否 取消 但我没有对源文件进行任何更改 我只想从 Word 文件创建 PDF
  • 如何解压 msgpack 文件?

    我正在将 msgpack 编码的数据写入文件 在编写时 我只是使用 C API 的 fbuffer 如 我为示例删除了所有错误处理 FILE fp fopen filename ab msgpack packer pk msgpack pa
  • 将 Lambda 表达式树与 IEnumerable 结合使用

    我一直在尝试了解有关使用 Lamba 表达式树的更多信息 因此我创建了一个简单的示例 这是代码 如果作为 C 程序粘贴到 LINQPad 中 它可以工作 void Main IEnumerable
  • 代码中的.net Access Forms身份验证“超时”值

    我正在向我的应用程序添加注销过期警报 并希望从我的代码访问我的 web config 表单身份验证 超时 值 我有什么办法可以做到这一点吗 我认为您可以从 FormsAuthentication 静态类方法中读取它 这比直接读取 web c
  • C++:二叉树所有节点值的总和

    我正在准备面试 我被一个二叉树问题困住了 我们如何计算二叉树所有节点中存在的值的总和 优雅的递归解决方案 伪代码 def sum node if node NULL return 0 return node gt value sum nod
  • 没有“对 *this”功能的右值引用的解决方法

    我有一个围绕可移动对象的代理容器类 并希望代理能够隐式生成对底层对象的右值引用 但仅当代理本身被移动时 我相信我将能够按照提案 n2439 实施此行为 将移动语义扩展到 this http www open std org jtc1 sc2
  • 为什么空循环使用如此多的处理器时间?

    如果我的代码中有一个空的 while 循环 例如 while true 它将把处理器的使用率提高到大约 25 但是 如果我执行以下操作 while true Sleep 1 它只会使用大约1 那么这是为什么呢 更新 感谢所有精彩的回复 但我

随机推荐

  • 一条指令清除 PF(奇偶校验标志)——获取结果寄存器中的奇数位

    在x86汇编中 是否可以在一条且只有一条指令中清除奇偶校验标志 在any初始寄存器配置 这相当于创建一个结果寄存器odd位数 以及任何设置标志的操作 明确排除mov 相比之下 设置奇偶校验标志可以在一条指令中完成 cmp bl bl 清除奇
  • Django 反序列化

    我收到以下错误 回溯 最近一次调用最后一次 文件 tests py 第 92 行 位于 test single search 对于serializers deserialize中的return obj json response ensur
  • 无法从资源加载定义

    我有一个 希望 非常基本的问题 我对 Ant 非常不熟悉 我只是尝试使用构建文件 以便为我最近发现的开源应用程序 Rapid Miner 编写一些插件 我一直在尝试使用 Eclipse 来编译它 遵循 Eclipses org 自己的说明
  • 是否有 UTF-16 字符串类型的 Rust 库? (用于编写 Javascript 解释器)

    For most程序 最好内部使用 UTF 8 http utf8everywhere org 并在必要时转换为其他编码 但就我而言 我想编写一个 Javascript 解释器 并且仅存储 UTF 16 字符串 或数组 要简单得多u16 因
  • ARKit根据触摸位置设置ARAnchor变换

    我正在 XCode 9 上使用 AR 入门应用程序 其中在点击场景中创建锚点 override func touchesBegan touches Set
  • 将原始帧转换为 webm 直播流

    我有一个 ASP NET 应用程序 其设置如下 以 656x492 分辨率捕获原始 RGB 帧的相机 这些帧在我的 C 代码中进行处理 带有一些简单的图像 加工 原始图像存储在字节数组中 以及包装在位图容器中 缺少魔法 将原始图像缓冲区转换
  • SVG 检测“fill: none”上的 Onclick 事件

    当我创建一个 svg 矩形时fill black my onclick事件处理程序被调用 当我更换fill black with fill none 当我在矩形内单击时 不会调用我的事件处理程序 而仅在单击border直肠的 我需要更改什么
  • GLSL 片段位置

    在我的 cpp 代码中 我创建了一个四边形列表 其中一些有一个标志 在像素着色器中 我检查是否设置了该标志 如果未设置标志 则四边形将变为红色 例如 如果设置了标志 我想决定每个像素的颜色 所以如果我需要将标记的四边形的一半着色为红色 另一
  • 如何解决 django 管理错误 302 问题?

    我在尝试登录 django 管理页面时不断收到错误 Watching for file changes with StatReloader Performing system checks System check identified n
  • Create React App 提供的react-scripts包需要依赖:

    项目依赖树可能有问题 这可能不是 Create React App 中的错误 而是您需要在本地修复的问题 Create React App 提供的react scripts包需要依赖 babel eslint 9 0 0 不要尝试手动安装它
  • 绑定到窗口高度和宽度的问题

    当我尝试将窗口的高度和宽度绑定到视图模型中的属性时 遇到一些问题 这是一个小示例应用程序来说明该问题 这是app xaml xs中的代码 public partial class App Application protected over
  • Java如何将单引号和双引号编码为HTML实体?

    我该如何编码 into 34 and into 39 我很惊讶 HTML Entities 4 0 中没有定义单引号和双引号 所以StringEscapeUtils无法将这两个字符转义到各自的实体中 还有其他与字符串相关的工具可以做到这一点
  • 当主体可以相对定位时,如何计算 dom 元素的页面位置?

    当我将主体设置为具有 39 像素边距的相对定位元素 我正在为页面顶部的工具栏腾出空间 时 我有一个奇怪的错误开始出现 无论如何 如果您查看大多数网站如何告诉您计算页面元素位置 您将看到如下代码 function getPos elt var
  • Chrome android 高度/滚动问题与页脚和地址栏

    这是我遇到的一个有趣的情况 您正在使用 Android 版 Chrome 当您滚动正文时 地址栏会消失并隐藏 伟大的 现在您想要向页面添加一个固定在底部的页脚 您执行以下操作 html margin 0 padding 0 height 1
  • 画布 ArcTo 混乱

    所以我再次处理环形扇区 这不是我的强项 我可以使用 arc画布上的方法很好 问题来自于需要我的弧线成为路径的一部分 例如 ctx save ctx arc centerX centerY radius startAngle endAngle
  • 使用面向 Net Standard 的 DotNet Core 创建 Azure WebJob 失败并出现错误

    我有一个 dot net core 控制台应用程序 我想在 Azure 中作为 webjob 运行 当它尝试执行时 我在日志中看到 错误 找不到依赖项清单中指定的程序集 程序包 Microsoft DotNet InternalAbstra
  • 简单的 jQuery、PHP 和 JSONP 示例?

    我面临着同源策略问题 通过研究该主题 我发现对于我的特定项目来说 最好的方法是使用 JSONP 来执行跨源请求 我一直在读IBM 的这篇关于 JSONP 的文章 http www ibm com developerworks library
  • R 中多个条件的高效条件求和

    我正在努力寻找解决以下问题的有效解决方案 我有一个大型的已处理数据框 大约有 8 列和 80000 行 通常包含多种数据类型 如果满足大数据框中的条件 我想创建一个新的数据框 其中包含一列的总和 想象一下原始数据帧的头部看起来像这样 yea
  • 有开源的pastebin吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我经常编写 wiki 页面或设置需要与其他开发人员共享的配置文件 是否有任何可以安装在您自己的网络中的
  • 访问表达式树中与子项(列表)相关的属性

    我为我的实体创建了一个存储库Master 在存储库中 我有一个Get使用 Entity Core 通过 Id 获取实体的方法 该方法接收 public TEntity Get object id params Expression