expression-trees 相关问题

表达式树是树结构中代码的抽象表示,其中树的每个节点表示编程构造(条件,赋值,方法调用等)

如何组成表达式:选择器+谓词?

假设我们有两个班级 公共类实体A { 公共 EntityB EntityB { 获取;放; } } 公共类实体B { 公共字符串名称{获取;放; } 公共布尔 IsDeleted { 得到;放; ...

回答 2 投票 0

Expression.使用自定义函数调用数组

我有一个项目列表,我想通过表达式,使用我自己的自定义函数过滤掉项目。 像这样的东西 返回 Items.Where(Foo) private static bool Foo(Item item) { item.Name.Equa...

回答 1 投票 0

从 MethodInfo 中检测索引器[重复]

给出以下代码: var dict = 新字典() { {"",""} }; 表达式> expr = () => dict[""]; expr.Body 返回

回答 1 投票 0

访问n叉树的x层来操作节点并通过递归添加子节点

我有一个问题正在尝试解决,我可以接受各种不同长度和复杂性的表达式并将它们作为节点插入到n元(或非二元)树中。 我需要确定

回答 1 投票 0

Csharp有没有办法写出真正静态的λ表达式?

语言:C# .Net版本:8.0 IDE:VS2020 / VSCode 操作系统:Windows11 难道Csharp就没有办法写一个真正静态的λ表达式吗? 今天学了柯里化,写了一篇...

回答 1 投票 0

如何使用Expression构建匿名类型?

在 C# 3.0 中,您可以使用 Expression 创建具有以下语法的类: var exp = Expression.New(typeof(MyClass)); var lambda = LambdaExpression.Lambda(exp); 对象 myObj = lambda.Compile().

回答 4 投票 0

无法从变量解析表达式常量

按照这篇文章标记的答案,我已将 Evaluator.cs 复制到我的项目中进行部分评估,以便能够解析表达式的局部变量。无论如何,我似乎错过了一些东西

回答 1 投票 0

Expression.Reduce() 的作用是什么?

我已经使用表达式树几天了,我很想知道 Expression.Reduce() 的作用。 msdn 文档不是很有帮助,因为它只指出它“减少”了

回答 6 投票 0

如何设置属性选择器表达式的值<Func<T,TResult>>

我需要使用模式工厂的想法将我的 Person 类实体中的实体属性 Address 与我的 FactoryEntities 类中的表达式 linq 相关联,看看这就是我所拥有的并且我想要做的: 地址

回答 8 投票 0

C# 合并/组合表达式

使用以下示例类(可以映射到数据库表): 类包 { 公共字符串名称{获取;放; } 公共小数价格 { get;放; } 公共布尔启用{获取; ...

回答 1 投票 0

我可以重用代码来使用 EF Core 为子属性选择自定义 DTO 对象吗?

使用 Entity Framework Core 进行查询时,我使用表达式转换为 DTO 对象,这对于对象和任何子集合都很有效。 一个简化的例子: 模型: 公开课莫...

回答 3 投票 0

如何在 C# 中使用表达式树动态地进行 NULL 检查并执行 ToLower 调用以及 Contains 调用

我正在尝试动态生成以下表达式 x => x?.ToLower().Contains(值?.ToLower()) 在我的 Item 类上。 这是我的 Item 类: 公开课项目 { 公共字符串?输入 { g...

回答 1 投票 0

从 MemberExpression 中获取对象?

所以,假设我在 C# 中有以下表达式: 表达式> expr = () => foo.Bar; 如何提取对 foo 的引用?

回答 6 投票 0

EF Core:按故障分组 - 不支持翻译包含分组参数但不包含组合的“选择”

下面的 LINQ 查询在 EF6 世界中工作得很好,整个查询似乎在服务器上进行评估(使用 SQL Profiler 检查),但在 EFCore6 中失败。 私有 IQueryable<

回答 2 投票 0

可以修改此函数来处理多个属性比较吗?

供参考,这是原始问题:DynamicWhere for List 这允许你这样做: var 人们 = new[] { 新{名字=“约翰”,姓氏=“斯密特...

回答 2 投票 0

ExecuteUpdateAsync 的 linq 表达式

我怀着极大的热情在 EF Core 7 中发现了 ExecuteDeleteAsync 和 ExecuteUpdateAsync。它们有助于使我的代码变得更简单、更快。批量无需使用自制程序...

回答 1 投票 0

动态 LINQ 查询生成器抛出异常

我正在尝试使用 Business-Class-Linq-Query 查询我的数据库实体。我知道我需要转换 LINQ 查询,以便它可以针对实体类运行。 我的问题是,我无法弄清楚,w...

回答 1 投票 0

使用 Moq.ItIs<expression tree>()

我不知道如何使用 Moq.ItIs<> 传递表达式树 参数类型为Expression> 但我不明白为什么我不能通过一些东西......

回答 1 投票 0

在代码中为导航属性项构建表达式树

我正在使用 VS2022 并使用 EF Core。我的数据上下文是 _myLab05Context,我有一个实体“解决方案”,它有一个导航属性“SolutionUsages”。 SolutionUsages 有一个

回答 1 投票 0

为什么 EF 不能翻译这个从虚拟属性派生的表达式?

我想定义一个 Expression> KeyExpr,例如您将传递给 IQueryable.OrderBy,然后将它与 TKey 值组合以派生一个 Expression 我想定义一个 Expression<Func<TSource,TKey>> KeyExpr,例如您将传递给 IQueryable.OrderBy,然后将其与 TKey 值组合以导出一个 Expression<Func<TSource,bool>> WithKeyExpr,例如您将传递给 IQueryable.Single。我在 another Q&A 中学习了如何做到这一点,并确认接受的答案有效。 我现在遇到的问题是当WithKeyExpr是虚的时候EF无法翻译KeyExpr。作为基线,我编写了一个非虚拟定义这些表达式的控制器: [ApiController] [Route("[controller]")] public class TestController : ControllerBase { private ErpContext Db { get; } private Expression<Func<Country, int>> KeyExpr { get; } = e => e.CountryId; private Expression<Func<Country, bool>> WithKeyExpr(int key) => Expression.Lambda<Func<Country, bool>>(Expression.Equal(KeyExpr.Body, Expression.Constant(key)), KeyExpr.Parameters); public TestController(ErpContext db) { Db = db; } [HttpGet] [Route("[action]")] [ProducesResponseType(typeof(IEnumerable<Country>), StatusCodes.Status200OK)] public async Task<IEnumerable<Country>> GetAsync() { return await Db.Countries.OrderBy(KeyExpr).ToListAsync(); } [HttpGet] [Route("{id}/[action]")] [ProducesResponseType(typeof(Country), StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status404NotFound)] public async Task<IActionResult> GetAsync(int id) { var country = await Db.Countries.SingleOrDefaultAsync(WithKeyExpr(id)); return country == null ? NotFound() : Ok(country); } } 这两个控制器动作都完美无缺。 为了重现我遇到的错误,我做了 KeyExpr 抽象。其他所有内容,包括WithKeyExpr,都以与之前完全相同的方式定义: [ApiController] [Route("[controller]")] public abstract class TestControllerBase : ControllerBase { private ErpContext Db { get; } protected abstract Expression<Func<Country, int>> KeyExpr { get; } private Expression<Func<Country, bool>> WithKeyExpr(int key) => Expression.Lambda<Func<Country, bool>>(Expression.Equal(KeyExpr.Body, Expression.Constant(key)), KeyExpr.Parameters); public TestControllerBase(ErpContext db) { Db = db; } [HttpGet] [Route("[action]")] [ProducesResponseType(typeof(IEnumerable<Country>), StatusCodes.Status200OK)] public async Task<IEnumerable<Country>> GetAsync() { return await Db.Countries.OrderBy(KeyExpr).ToListAsync(); } [HttpGet] [ProducesResponseType(typeof(Country), StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status404NotFound)] [Route("{id}/[action]")] public async Task<IActionResult> GetAsync(int id) { var country = await Db.Countries.SingleOrDefaultAsync(WithKeyExpr(id)); return country == null ? NotFound() : Ok(country); } } 然后我推导出一个具体的控制器: public class TestController : TestControllerBase { public TestController(ErpContext db) : base(db) { } protected override Expression<Func<Country, int>> KeyExpr => o => o.CountryId; } Get() 仍然有效,表明 EF 可以翻译虚拟 KeyExpr。但是 Get(int) 确实 not 工作; EF 无法翻译从虚拟 WithKeyExpr 派生的 KeyExpr。错误是: 无法翻译 LINQ 表达式“o”。 为什么EF不能再翻译WithKeyExpr? 问题在这里: protected override Expression<Func<Country, int>> KeyExpr => o => o.CountryId; 这将为每次调用 KeyExpr 属性返回一个新的表达式实例,因此 o 中的 KeyExpr.Parameters 将与 o 中使用的 KeyExpr.Body 不同。修复它的一种方法是将具体类更改为: public class TestController : TestControllerBase { // ... protected override Expression<Func<Country, int>> KeyExpr { get; } = o => o.CountryId; }

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.