Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何根据特定的子行有效地筛选父记录

如何根据特定的子行有效地筛选父记录
EN

Stack Overflow用户
提问于 2022-07-25 05:10:28
回答 1查看 82关注 0票数 0

我的Server数据库中有两个相关的表: Transaction和TransactionHistory。一对多的关系。基本上,它们的结构如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Transaction
    TransactionID
    Tries
    (other fields)

TransactionHistory
    TransactionHistoryID
    TransactionID (a foreign key)
    CreationDate
    Status
    ErrorType
    (other fields)

在我的EF核心对象模型中,我有相应的类:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Transaction
{
    public int TransactionID { get; set; }
    public int Tries {get; set; }
    public ICollection<TransactionHistory> TransactionHistories{ get; set; }
    /// Other fields
}

public class TransactionHistory
{
    public int TransactionHistoryID { get; set; }
    public int TransactionID  { get; set; }
    public DateTime CreationDate { get; set; }
    public string Status{ get; set; }
    public string ErrorType { get; set; }
    public Transaction Transaction { get; set; }
    /// Other fields
}

我需要的是从事务表中获取记录,并根据这个子行的值过滤事务记录。例如,我有一个LINQ查询来获取那些处于“就绪”状态或处于可以再次尝试的“错误”状态的事务,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var retriableErrorTypes = new List<string>(){"CONNECTION", "TECHNICAL"};
var MaxTries = 3;

DbContext.Transaction
    .Include(t => t.TransactionHistories.OrderByDescending(h => h.CreationDate).Take(1))
    .Where(t => t.TransactionHistories.OrderByDescending(h => h.CreationDate).First().Status == "READY"
                || (t.TransactionHistories.OrderByDescending(h => h.CreationDate).First().Status == "ERROR"
                    && retriableErrorTypes.Contains(t.TransactionHistories.OrderByDescending(h => h.CreationDate).First().ErrorType)
                    && t.Tries < MaxTries));

乍一看,结果似乎是正确的,尽管我还没有完全测试这一点。但是,必须不断地重复子查询才能获得最近的子行并不好。实际上,这种重复在生成的SQL查询中结束(根据LINQPad):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT [t].[TransactionID], [t].[Tries], [t2].[TransactionHistoryID], [t2].[CreationDate], [t2].[Status], [t2].[ErrorType], [t2].[TransactionID]
FROM [dbo].[Transaction] AS [t]
LEFT JOIN (
    SELECT [t1].[TransactionHistoryID], [t1].[CreationDate], [t1].[Status], [t1].[ErrorType], [t1].[TransactionID]
    FROM (
        SELECT [t0].[TransactionHistoryID], [t0].[CreationDate], [t0].[Status], [t0].[ErrorType], [t0].[TransactionID], ROW_NUMBER() OVER(PARTITION BY [t0].[TransactionID] ORDER BY [t0].[CreationDate] DESC) AS [row]
        FROM [dbo].[TransactionHistory] AS [t0]
    ) AS [t1]
    WHERE [t1].[row] <= 1
) AS [t2] ON [t].[TransactionID] = [t2].[TransactionID]
WHERE ((
    SELECT TOP(1) [t3].[Status]
    FROM [dbo].[TransactionHistory] AS [t3]
    WHERE [t].[TransactionID] = [t3].[TransactionID]
    ORDER BY [t3].[CreationDate] DESC) = N'READY') OR ((((
    SELECT TOP(1) [t4].[Status]
    FROM [dbo].[TransactionHistory] AS [t4]
    WHERE [t].[TransactionID] = [t4].[TransactionID]
    ORDER BY [t4].[CreationDate] DESC) = N'ERROR') AND (
    SELECT TOP(1) [t5].[ErrorType]
    FROM [dbo].[TransactionHistory] AS [t5]
    WHERE [t].[TransactionID] = [t5].[TransactionID]
    ORDER BY [t5].[CreationDate] DESC) IN (N'CONNECTION', N'TECHNICAL')) AND ([t].[Tries] < @__MaxTries_1))
ORDER BY [t].[TransactionID], [t2].[TransactionID], [t2].[CreationDate] DESC, [t2].[TransactionHistoryID]

这根本没有效率。WHERE子句中的这三个子查询和FROM子句中的一个子查询最终都会获取相同的行。我想找到一种方法来编写LINQ查询,以尽量减少这种重复,但到目前为止,我没有得到更好的结果。

我试着用投影来做这样的事情:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DbContext.Transaction.Select(t => new {t, TransactionHistory = t.TransactionHistories.OrderByDescending(h => h.CreationDate).First()})
    .Where(t => t.TransactionHistory.Status == "READY"
                || (t.TransactionHistory.Status == "ERROR"
                    && retriableErrorTypes.Contains(t.TransactionHistory.ErrorType)
                    && t.t.Tries < MaxTries));

但是,虽然LINQ查询更具可读性,不会重复其自身,但它对生成的SQL查询没有任何影响,因为它与生成的SQL查询基本相同(至少根据LINQPad )。另外,它返回匿名类型的记录,而不是事务类型,这不是我想要的,但是我可以简单地重新转换结果,所以这不是问题。

我的问题是:如何在LINQ查询中,有效地获取特定的子行,并根据此子行筛选父记录?

注意:正如标记中所指定的,这是针对带有实体框架核心的.NET 5应用程序的,尽管它很可能会升级到.NET 6。此外,这是一个新的系统和一个新的数据库,因此可以根据需要调整数据库结构。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-25 05:54:50

尝试以下查询,它应该是有效的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var retriableErrorTypes = new List<string>(){"CONNECTION", "TECHNICAL"};
var MaxTries = 3;

var query = 
    from t in DbContext.Transaction
    from h in t.TransactionHistories.OrderByDescending(h => h.CreationDate).Take(1)
    where h.Status == "READY"
        || (h.Status == "ERROR" && retriableErrorTypes.Contains(h.ErrorType) && t.Tries < MaxTries)
    select new 
    {
        Transaction = t,
        LastHistory = h
    };
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73109803

复制
相关文章
java根据子节点获取它对应的所有父节点_java根据父节点查找子节点
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/10/01
6.9K0
R语言:以多列标准筛选特定行
在本期,我们会运用一个病例数据为大家进行讲解示范,这也是大猫课堂第一次针对阅读者提问进行的反馈,也希望大家能提供一些有趣的问题,来和我们一起分享,同时也感谢读者孤鹜惜秋,与我们分享其问题。话不多说,马上进入正题。
用户7652506
2020/08/12
2K0
R语言:以多列标准筛选特定行
如何根据特定值找到IDOC
IDOC的官方名称叫Intermediate Document,用于两个模块,或者两个系统间交换信息。
用户5495712
2020/10/22
1.8K0
如何根据特定值找到IDOC
treeview插件使用:根据子节点选中父节点
  鄙人公司没有专门的前端,所以项目开发中都是前后端一起抡。最近用bootstrap用的比较频繁,发现bootstrap除了框架本身的样式组件外,还提供了多种插件供开发者选择。本篇博文讲的就是boot
用户1615728
2018/04/17
6K0
treeview插件使用:根据子节点选中父节点
ORACLE:根据父id查询所有子孙数据,或者根据子id查询所有父数据(start with connect by prior)
一、需求: 我们在开发中经常遇到一种数据库表的设计:一个表中包含父子信息数据,也就是常说的树形数据. ---> 最常见的例子就是省市区一体表,就是通过id、pid、level来进行控制,从而一张表来存储数据.我们进行拿数据的时候,不用再连表拿取,直接通过(start with connect by prior)直接便利就会得到数据. 二、准备省市区表: CREATE TABLE REGION ( "ID" NUMBER NOT NULL, "name" VARCHAR2(200 BYTE),
掉发的小王
2022/07/11
2.6K0
ORACLE:根据父id查询所有子孙数据,或者根据子id查询所有父数据(start with connect by prior)
如何有效地记录 Java SQL 日志?
在常规项目的开发中可能最容易出问题的地方就在于对数据库的处理了,在大部分的环境下,我们对数据库的操作都是使用流行的框架,比如 Hibernate 、 MyBatis 等。 由于各种原因,我们有时会想
lyb-geek
2019/11/20
1.6K0
如何有效地记录 Java SQL 日志?
如何根据class_code筛选转录本?
得到一个 merged.combined.gtf这个文件里给每一个转录本分配了一个class_code用来表示转录本相对于参考基因组的位置
用户7010445
2020/07/22
2.3K0
python读取特定的行
fr = open(filename) for line in fr.readlines():     if line.startswith("#"):         continue     else:         ## do something with line          ## could use fr.readlines()[1:]  from second line import linecache content_list = linecache.getlines(filenam
py3study
2020/01/13
3.9K0
如何利用 pandas 根据数据类型进行筛选?
让我们从第 4 题开始,取出 D 列全部非整数行,其实在 pandas 中可以使用.is_integer() 判断一个元素是否为整数。
刘早起
2022/09/21
1.4K0
SQL根据指定节点ID获取所有父级节点和子级节点
根据指定节点ID获取所有父节点 with temp as( select * from dbo.Category where Id=493 --表的主键ID union all select t.* from temp,dbo.Category t where temp.Pid=t.Id --父级ID=子级ID )select * from temp order by Level; [查询结果] 根据指定节点ID获取所有子节点 with temp as( select * from dbo.Category
段邵华
2019/08/01
6K0
vue 父组件调用子组件的方法_vue子组件修改父组件值
我们都知道通过$ref可以获取到某个DOM,但是它也可以用来获取子组件的实例,调用子组件的方法
全栈程序员站长
2022/11/09
2K0
子组件传对象给父组件_react子组件改变父组件的状态
sendData = () => { let data = ‘1234’; this.props.getData(data); //这个this,props.xxx 后面的xxx是是在父组件那使用的名字; }, 然后可以在render函数后使用这个方法或者另外定义一个事件去触发该方法进行传值,
全栈程序员站长
2022/10/04
2.8K0
父进程退出时如何确保子进程退出?
子进程退出的时候,父进程能够收到子进程退出的信号,便于管理,但是有时候又需要在父进程退出的时候,子进程也退出,该怎么办呢?
编程珠玑
2019/09/02
12.4K0
vue 父组件调用子组件的函数_vue子组件触发父组件方法
项目里将element-ui的el-upload写成公共组件方便调用,官方的before-upload方法用于处理上传前要做的事,如:比较文件大小,限制文件类型等,通过返回true 或 false 控制是否上传。 当该组件调用父组件方法,并且要能获取到父组件方法的返回值,如何实现?
全栈程序员站长
2022/11/10
3K0
问与答124:如何根据输入值进行动态筛选?
Q:我想在工作表中应用动态筛选,当我在文本框中输入时,Excel会根据我输入的数据动态显示工作表中与输入值相匹配的数据,如何实现?
fanjy
2021/05/07
2K0
Vue 在父(子)组件引用其子(父)组件方法和属性
<button @click="callChildMethod()">父组件调用子组件方法</button>
授客
2020/06/23
1.9K0
uni-app 父组件的参数如何传给子组件
uni-app 如何在组件和组件之间,页面和组件之间相互传值 父组件向子组件传值 通过props来实现,子组件通过props来接收父组件传过来的值! 父组件中: 第一步:引入子组件;
达达前端
2019/10/29
4.4K0
vue父组件操作子组件的方法_vue父组件获取子组件数据
我们经常分不清什么是父组件,什么是子组件。现在来简单总结下:我们将某段代码封装成一个组件,而这个组件又在另一个组件中引入,而引入该封装的组件的文件叫做父组件,被引入的组件叫做子组件。具体代码如下
全栈程序员站长
2022/09/19
7K0
vue父组件操作子组件的方法_vue父组件获取子组件数据
vue子组件传值给父组件_子组件调用父组件中的方法
大家好,又见面了,我是你们的朋友全栈君。 参考视频 : https://www.bilibili.com/video/av32790541/?spm_id_from=trigger_reload 原
全栈程序员站长
2022/10/04
4.2K0
vue子组件传值给父组件_子组件调用父组件中的方法
vue父组件调用子组件属性_vue子组件获取父组件实例
但是在vue3中,很显然使用this.$emit() 已经开始报错了,为什么会报错呢?
全栈程序员站长
2022/11/10
2.1K0

相似问题

根据子记录上的条件筛选父记录

30

如何根据特定值筛选行

11

如何根据内部(子)对象筛选父对象?

12

根据父id筛选子元素的数组

16

Netsuite根据父记录中的供应商筛选项子列表

31
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文