我该如何转换这个 linq 表达式?

2024-02-10

假设我有一个要查询并应用排名的实体:

public class Person: Entity
{
    public int Id { get; protected set; }
    public string Name { get; set; }
    public DateTime Birthday { get; set; }
}

在我的查询中,我有以下内容:

Expression<Func<Person, object>> orderBy = x => x.Name;

var dbContext = new MyDbContext();

var keyword = "term";
var startsWithResults = dbContext.People
    .Where(x => x.Name.StartsWith(keyword))
    .Select(x => new {
        Rank = 1,
        Entity = x,
    });
var containsResults = dbContext.People
    .Where(x => !startsWithResults.Select(y => y.Entity.Id).Contains(x.Id))
    .Where(x => x.Name.Contains(keyword))
    .Select(x => new {
        Rank = 2,
        Entity = x,
    });

var rankedResults = startsWithResults.Concat(containsResults)
    .OrderBy(x => x.Rank);

// TODO: apply thenby ordering here based on the orderBy expression above

dbContext.Dispose();

在选择匿名对象之前,我尝试对结果进行排序Rank财产,但订单最终会丢失。看起来 linq toEntity 放弃了单独集合的排序,并在两个过程中转换回自然排序Concat and Union.

我认为我可以做的是动态转换定义在orderBy变量来自x => x.Name to x => x.Entity.Name,但我不知道如何:

if (orderBy != null)
{
    var transformedExpression = ???
    rankedResults = rankedResults.ThenBy(transformedExpression);
}

我怎样才能使用Expression.Lambda包裹x => x.Name into x => x.Entity.Name?当我硬编码时x => x.Entity.Name进入ThenBy我得到了我想要的订单,但是orderBy由查询的调用类提供,因此我不想对其进行硬编码。为了简化解释,我在上面的示例中对其进行了硬编码。


这应该有帮助。然而,您必须具体化匿名类型才能使其发挥作用。我的 LinqPropertyChain 无法使用它,因为它很难创建Expression<Func<Anonymous, Person>>虽然它仍然是匿名的。

Expression<Func<Person, object>> orderBy = x => x.Name;

using(var dbContext = new MyDbContext())
{
var keyword = "term";
var startsWithResults = dbContext.People
    .Where(x => x.Name.StartsWith(keyword))
    .Select(x => new {
        Rank = 1,
        Entity = x,
    });
var containsResults = dbContext.People
    .Where(x => !startsWithResults.Select(y => y.Entity.Id).Contains(x.Id))
    .Where(x => x.Name.Contains(keyword))
    .Select(x => new {
        Rank = 2,
        Entity = x,
    });


var rankedResults = startsWithResults.Concat(containsResults)
    .OrderBy(x => x.Rank)
    .ThenBy(LinqPropertyChain.Chain(x => x.Entity, orderBy));

// TODO: apply thenby ordering here based on the orderBy expression above

}

public static class LinqPropertyChain 
{

    public static Expression<Func<TInput, TOutput>> Chain<TInput, TOutput, TIntermediate>(
        Expression<Func<TInput, TIntermediate>> outter,
        Expression<Func<TIntermediate, TOutput>> inner
        )
    {

        Console.WriteLine(inner);
        Console.WriteLine(outter);
        var visitor = new Visitor(new Dictionary<ParameterExpression, Expression>
        {
            {inner.Parameters[0], outter.Body}
        });

        var newBody = visitor.Visit(inner.Body);
        Console.WriteLine(newBody);
        return Expression.Lambda<Func<TInput, TOutput>>(newBody, outter.Parameters);
    }

    private class Visitor : ExpressionVisitor
    {
        private readonly Dictionary<ParameterExpression, Expression> _replacement;

        public Visitor(Dictionary<ParameterExpression, Expression> replacement)
        {
            _replacement = replacement;
        }

        protected override Expression VisitParameter(ParameterExpression node)
        {
            if (_replacement.ContainsKey(node))
                return _replacement[node];
            else
            {
                return node;
            }
        }
    }
}

找到了一种用更少的显式泛型来做到这一点的方法。

Expression<Func<Person, object>> orderBy = x => x.Name;
Expression<Func<Foo, Person>> personExpression = x => x.Person;

var helper = new ExpressionChain(personExpression);
var chained = helper.Chain(orderBy).Expression;


// Define other methods and classes here
public class ExpressionChain<TInput, TOutput>
{
    private readonly Expression<Func<TInput, TOutput>> _expression; 
    public ExpressionChain(Expression<Func<TInput, TOutput>> expression)
    {
        _expression = expression;
    }

    public Expression<Func<TInput, TOutput>> Expression { get { return _expression; } }

    public ExpressionChain<TInput, TChained> Chain<TChained>
        (Expression<Func<TOutput, TChained>> chainedExpression)
    {
        var visitor = new Visitor(new Dictionary<ParameterExpression, Expression>
        {
            {_expression.Parameters[0], chainedExpression.Body}
        });
        var lambda = Expression.Lambda<Func<TInput, TOutput>>(newBody, outter.Parameters);
        return new ExpressionChain(lambda);
    }

    private class Visitor : ExpressionVisitor
    {
        private readonly Dictionary<ParameterExpression, Expression> _replacement;

        public Visitor(Dictionary<ParameterExpression, Expression> replacement)
        {
            _replacement = replacement;
        }

        protected override Expression VisitParameter(ParameterExpression node)
        {
            if (_replacement.ContainsKey(node))
                return _replacement[node];
            else
            {
                return node;
            }
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我该如何转换这个 linq 表达式? 的相关文章

  • 如何在嵌套列表视图中编辑数据

    我使用列表视图来显示项目列表 并使用嵌套列表视图来显示每个项目的功能列表 父列表视图和子列表视图都需要能够进行插入 编辑和删除操作 它适用于父列表视图 但是 当我尝试编辑子项目时 编辑按钮不会将其带入编辑模式 您能建议我代码中缺少什么吗
  • 连接两个 Func 委托

    我有这个课程 public class Order int OrderId get set string CustomerName get set 我也声明了以下变量 Func
  • 合并两个 linq 表达式

    我有两个在不同时间构建的表达式 但需要合并才能获得 where 子句的准确 分组 我确实尝试过this https stackoverflow com questions 10390784 how do i combine expressi
  • 使用匿名类型的 C# LINQ 构建表达式

    我有只使用一个属性 名称 构建列表的代码 如何修改代码 以便它可以构建具有两个属性 Name 和 Test Result 的列表 我知道可以使用匿名类型来执行此操作 但是如何将它们放入动态表达式中 这是我的代码 string item Na
  • 实体框架:数据库上下文可以在不同模式之间拥有外键吗? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我们有一个具有多个模式的数据库 公司架构师希望每个架构都有实体框架 DbContext 此外 不同模式之间还存在外键关系 今天在搭建架
  • 实体创建无用的 id 字段

    我有一个CrudRepository与两个实体 Problem 特征实体总是创建一个附加的id数据库中的字段但未选择正确的characteristic id要生成的字段JSON machine entity machine id name
  • 这个 python 函数中的 lambda 表达式是怎么回事? [复制]

    这个问题在这里已经有答案了 为什么创建柯里化函数列表的尝试不起作用 def p x num print x num def test a for i in range 10 a append lambda x p i x return a
  • 如何根据表名在 DbContext 中选择正确的 DbSet

    假设我有一个包含以下 DbSet 的 DbContext class Amimals DbContext public DbSet
  • MVC3数据缓存技术

    我有一个 sql 查询 存储过程 在结果显示在网络网格中之前需要大约 8 10 秒才能返回 关于 asp net mvc3 中的缓存的性能最佳实践是什么 以便用户不必每次都花费 8 10 秒来加载该数据 减少优化查询 你可以使用内存缓存 h
  • 在 Linq 查询中使用动态列名称

    foreach Dimension dimensions in Enum GetValues typeof Dimension var r new ReferenceTable dimensions referenceItems List
  • 推断“x => { throw .. }”的 Lambda 与重载方法中的 Func 匹配吗?

    我不明白为什么 C 最终在以下 LINQPad 代码中执行不正确的扩展方法 void Main Actual Sync Action Expected Sync Action Run x gt x Dump Actual Async Tas
  • SingleOrDefault异常处理

    我有一个示例代码 它调用 SingleOrDefault 方法 3 次 并在任何序列具有多个匹配元素时记录异常 如果我想检查这段代码的哪一部分抛出异常 问题就开始了 是否可以从此异常中获取一些有用的信息 例如谓词参数或集合类型以进行更详细的
  • 删除大量记录需要很长时间

    我有一个包含约 60 000 行的数据库表 在 SQL Server 2012 Express 上运行 我使用以下代码来清除旧行 Deleting CPU measurements older than oldestAllowedTime
  • 无法在 AWS Lambda 自定义授权方中验证 Twilio 请求

    我使用 NodeJS 构建了一个自定义授权者 lambda 函数 并将其配置为授权 AWS 中的另一个 lambda 函数 这个其他函数是从 HTTP 端点触发的 并且具有我在 Twilio Messaging Service 中配置为 w
  • 在 C# 中将平面数据库结果集转换为分层对象集合

    我有一个数据库查询 它以平面格式返回分层数据 例如客户 订单和订单项目 只是一个例子 我的数据不同 如何将其转换为分层对象集合 即客户对象的集合 其中每个客户对象都有订单对象的集合 每个订单对象都有订单项目对象的集合 这只是循环遍历每个项目
  • 实体框架底层提供程序在打开时失败

    下面是我的连接字符串 connectionString 元数据 res EDMX Test csdl res EDMX Test ssdl res EDMX Test msl provider System Data SqlClient p
  • linq 中使用字符串数组 c# 的 'orderby'

    假设我有一个这样的方法定义 public CustomerOrderData GetCustomerOrderData string CustomerIDs var query from a in db Customer join b in
  • 使用查询表达式对 List 进行排序

    我在使用 Linq 订购这样的结构时遇到问题 public class Person public int ID get set public List
  • 如何在三个 IEnumerable 上使用 Zip [重复]

    这个问题在这里已经有答案了 可能的重复 使用 Linq 从 3 个集合创建项目 https stackoverflow com questions 5284315 create items from 3 collections using
  • 搜索实体的所有字段

    我正在尝试在客户数据库上实现 多功能框 类型的搜索 其中单个查询应尝试匹配客户的任何属性 这是一些示例数据来说明我想要实现的目标 FirstName LastName PhoneNumber ZipCode Mary Jane 12345

随机推荐

  • 带有管道模式的 IIS 7.0 = Integrated 不会在 ASP .NET 中加载任何图像/CSS

    我有一个在 IIS 5 1 中工作的完整系统 我使用经典管道模式迁移到 IIS 7 0 一切正常 但使用管道集成时 我的图像 css 未加载 我正在将 ASP NET 3 5 与 Web 应用程序一起使用 有什么帮助吗 在 IIS 7 中
  • 如何实现多行文本加载动画?

    我正在尝试仅使用来实现文本加载动画CSS 我所拥有的是黑色文本 然后当页面加载时 文本将在几秒钟内开始填充红色 我面临的问题是文本加载动画工作正常 但是当文本结束并以新行开始时 动画文本仍然在同一行上继续 我怎样才能解决这个问题 body
  • 通过显式排序避免死锁

    我想明确提供有关 MySql InnoDB 应如何获取行锁的顺序 如果可能的话 就不应该出现任何死锁 如果我们遵循惯例 首先 数据库应该按升序锁定表 models 中找到的所有行 然后第二个表 颜色 中的所有行都应按升序锁定 有没有办法控制
  • Numpy:多轴上的 argmax 无循环

    我有一个 N 维数组 名为 A 对于A的第一轴的每一行 我想获得A的其他轴上的最大值的坐标 然后我将返回一个二维数组 其中包含第一轴的每一行的最大值的坐标A 的 我已经使用循环解决了我的问题 但我想知道是否有更有效的方法来做到这一点 我当前
  • 读取包含日期和时间的 csv

    我正在 R 中工作并阅读 csv 其第一列中有日期和时间 我想先在R中导入这个csv文件 然后将其转换为zoo对象 我正在使用 R 中的代码 EURUSD lt as xts read zoo myfile csv sep tz heade
  • 优先选择同步而不是易失性

    我读过这个answer https stackoverflow com a 3488771 2786156最后写下以下内容 任何你能用 易失性 实现的事情都可以用同步完成 但是 反之则不然 目前还不清楚 JLS 8 3 1 4 https
  • Swift 2 未使用的持续警告

    我收到一条警告 说我的常量未使用 从未使用过不可变值 myConst 的初始化 考虑替换为 的赋值或将其删除 if someVal value nil let myConst someVal value 那么重命名会怎样let myCons
  • 如何使用 C# API 将 BigQuery 行转换为 JSON?

    我使用下面的 C 代码从 BigQuery 表中提取一些数据 BigQueryClient client BigQueryClient Create
  • Ruby on Rails - 搜索结果分页

    我有 2 个模型 Post 和 Location 其中 location has many posts 和 post owns to location 搜索工作正常 分页也工作正常 除了total entries 结果显示超过 10 条 查
  • 以编程方式更改 UIImageView Xcode Swift 的高度和宽度

    嘿 出于某种原因 我正在努力尝试设置我的图像视图之一的高度和宽度 我想将其设置为高度仅占屏幕的 20 我知道要定期设置它 您可以执行以下操作 图像 0 0 50 50 但我需要高度不是一个静态数字 像 image 0 0 frame hei
  • 为什么 val_loss 和 val_acc 不显示?

    训练开始时 运行窗口中仅显示loss和acc 缺少val loss和val acc 仅在最后才会显示这些值 model add Flatten model add Dense 512 activation relu model add Dr
  • jQuery + Gravity Forms:在错误验证时执行 jQuery

    我在当前的重力形式上使用了一些 jQuery 然而 当我提交表单并返回错误验证时 我丢失了一些 jQuery 目标 我很好奇如何更换 document ready function 一旦字段因错误验证而重新加载 就会调用我的 jQuery
  • 基于 BERT 的 NER 模型在反序列化时给出不一致的预测

    我正在尝试在 Colab 云 GPU 上使用 HuggingFace 变压器库训练 NER 模型 对其进行 pickle 并将模型加载到我自己的 CPU 上以进行预测 Code 模型如下 from transformers import B
  • 如何仅从级别顺序遍历字符串构造二叉树

    考虑具有以下属性的二叉树 如果内部节点 非叶节点 有两个子节点 则其值为 1 叶节点的值为 0 因为它没有子节点 树上的级别顺序遍历将生成一串 1 和 0 通过在访问每个节点时打印奇怪的值 现在给定这个字符串构造二叉树并在树上执行后序遍历
  • BPMN的优点和缺点?

    我希望您能告诉我从开发人员的角度来看 BPMN 的优点和缺点是什么 我将 UML 与 BPMN 进行比较 发现 UML 有很多优点和缺点 但 BPMN 却没有 这很大程度上取决于观众和目的 在建模语言方面 BPMN 和 UML 活动图涵盖了
  • Numpy - 用 NaN 替换数字

    我正在寻找用 numpy 中的 NaN 替换数字 并且正在寻找类似的函数numpy nan to num 除非相反 随着处理不同的数组 该数字可能会发生变化 因为每个数组都可以有唯一定义的 NoDataValue 我见过人们使用字典 但数组
  • 我什么时候应该在 Asp.Net Core 中使用 Task.Run?

    我相信您永远不必在 net core web 上下文中使用 Task Run 进行任何操作 如果您有一个长时间运行的任务或 CPU 密集型任务 您可以将其卸载到消息队列以进行异步处理 如果您有一个同步操作 但没有等效的异步方法 那么卸载到后
  • 文档中的 Firebase 云函数幂等性

    我正在关注 Firestore 的文档这里关于聚合查询 https cloud google com firestore docs solutions aggregation 我忍不住注意到云函数解决方案无法完全工作 因为它不是幂等的 nu
  • 我遇到此错误执行 org.jetbrains.kotlin.gradle.internal.KaptExecution 时发生失败

    在我的应用程序中 我有一个模型类 它有一些变量 我可以使用改造和房间数据库在该应用程序中调用并显示这些数据 这意味着该应用程序首先从服务器收集数据 然后显示在房间数据库中 但是当我在这个模型类中使用列表时 它显示了这个错误 这是我的代码 M
  • 我该如何转换这个 linq 表达式?

    假设我有一个要查询并应用排名的实体 public class Person Entity public int Id get protected set public string Name get set public DateTime