表达式树是树结构中代码的抽象表示,其中树的每个节点表示编程构造(条件,赋值,方法调用等)
假设我们有两个班级 公共类实体A { 公共 EntityB EntityB { 获取;放; } } 公共类实体B { 公共字符串名称{获取;放; } 公共布尔 IsDeleted { 得到;放; ...
我有一个项目列表,我想通过表达式,使用我自己的自定义函数过滤掉项目。 像这样的东西 返回 Items.Where(Foo) private static bool Foo(Item item) { item.Name.Equa...
给出以下代码: var dict = 新字典() { {"",""} }; 表达式> expr = () => dict[""]; expr.Body 返回
我有一个问题正在尝试解决,我可以接受各种不同长度和复杂性的表达式并将它们作为节点插入到n元(或非二元)树中。 我需要确定
语言:C# .Net版本:8.0 IDE:VS2020 / VSCode 操作系统:Windows11 难道Csharp就没有办法写一个真正静态的λ表达式吗? 今天学了柯里化,写了一篇...
在 C# 3.0 中,您可以使用 Expression 创建具有以下语法的类: var exp = Expression.New(typeof(MyClass)); var lambda = LambdaExpression.Lambda(exp); 对象 myObj = lambda.Compile().
按照这篇文章标记的答案,我已将 Evaluator.cs 复制到我的项目中进行部分评估,以便能够解析表达式的局部变量。无论如何,我似乎错过了一些东西
我已经使用表达式树几天了,我很想知道 Expression.Reduce() 的作用。 msdn 文档不是很有帮助,因为它只指出它“减少”了
如何设置属性选择器表达式的值<Func<T,TResult>>
我需要使用模式工厂的想法将我的 Person 类实体中的实体属性 Address 与我的 FactoryEntities 类中的表达式 linq 相关联,看看这就是我所拥有的并且我想要做的: 地址
使用以下示例类(可以映射到数据库表): 类包 { 公共字符串名称{获取;放; } 公共小数价格 { get;放; } 公共布尔启用{获取; ...
我可以重用代码来使用 EF Core 为子属性选择自定义 DTO 对象吗?
使用 Entity Framework Core 进行查询时,我使用表达式转换为 DTO 对象,这对于对象和任何子集合都很有效。 一个简化的例子: 模型: 公开课莫...
如何在 C# 中使用表达式树动态地进行 NULL 检查并执行 ToLower 调用以及 Contains 调用
我正在尝试动态生成以下表达式 x => x?.ToLower().Contains(值?.ToLower()) 在我的 Item 类上。 这是我的 Item 类: 公开课项目 { 公共字符串?输入 { g...
所以,假设我在 C# 中有以下表达式: 表达式> expr = () => foo.Bar; 如何提取对 foo 的引用?
EF Core:按故障分组 - 不支持翻译包含分组参数但不包含组合的“选择”
下面的 LINQ 查询在 EF6 世界中工作得很好,整个查询似乎在服务器上进行评估(使用 SQL Profiler 检查),但在 EFCore6 中失败。 私有 IQueryable<
供参考,这是原始问题:DynamicWhere for List 这允许你这样做: var 人们 = new[] { 新{名字=“约翰”,姓氏=“斯密特...
我怀着极大的热情在 EF Core 7 中发现了 ExecuteDeleteAsync 和 ExecuteUpdateAsync。它们有助于使我的代码变得更简单、更快。批量无需使用自制程序...
我正在尝试使用 Business-Class-Linq-Query 查询我的数据库实体。我知道我需要转换 LINQ 查询,以便它可以针对实体类运行。 我的问题是,我无法弄清楚,w...
使用 Moq.ItIs<expression tree>()
我不知道如何使用 Moq.ItIs<> 传递表达式树 参数类型为Expression> 但我不明白为什么我不能通过一些东西......
我正在使用 VS2022 并使用 EF Core。我的数据上下文是 _myLab05Context,我有一个实体“解决方案”,它有一个导航属性“SolutionUsages”。 SolutionUsages 有一个
我想定义一个 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; }