gpt4 book ai didi

asp.net - 高效连接 Entity Framework Core 中另一个表的最新记录

转载 作者:行者123 更新时间:2023-12-02 14:21:48 25 4
gpt4 key购买 nike

我将从 PHP w/MySQL 转向 ASP .NET Core。

<小时/>

问题:

为了便于说明,假设有以下两个表: T: {ID, Description, FK}States: {ID, ID_T, Time, State} 。它们之间存在 1:n 关系( ID_T 引用文献 T.ID )。

我需要 T 中的所有记录具有特定值 FK (假设 1 )以及 States 中的相关最新记录(如果有的话)。

<小时/>

就SQL而言,可以写成:

SELECT T.ID, T.Description, COALESCE(s.State, 0) AS 'State' FROM T
LEFT JOIN (
SELECT ID_T, MAX(Time) AS 'Time'
FROM States
GROUP BY ID_T
) AS sub ON T.ID = sub.ID_T
LEFT JOIN States AS s ON T.ID = s.ID_T AND sub.Time = s.Time
WHERE FK = 1

我正在努力在 LINQ(或 Fluent API)中编写高效的等效查询。到目前为止我得到的最好的工作解决方案是:

from t in _context.T
where t.FK == 1
join s in _context.States on t.ID equals o.ID_T into _s
from s in _s.DefaultIfEmpty()
let x = new
{
id = t.ID,
time = s == null ? null : (DateTime?)s.Time,
state = s == null ? false : s.State
}
group x by x.id into x
select x.OrderByDescending(g => g.time).First();

当我在执行时在输出窗口中检查生成的 SQL 查询时,它就像:

SELECT [t].[ID], [t].[Description], [t].[FK], [s].[ID], [s].[ID_T], [s].[Time], [s].[State]
FROM [T] AS [t]
LEFT JOIN [States] AS [s] ON [T].[ID] = [s].[ID_T]
WHERE [t].[FK] = 1
ORDER BY [t].[ID]

它不仅选择了比我需要的更多的列(在实际方案中,有更多的列)。 查询中没有分组,因此我认为它从数据库中选择所有内容(States将会很大),并且分组/过滤发生在数据库外部。

<小时/>

问题:

你会做什么?

  • LINQ/Fluent API 中是否有高效的查询?
  • 如果没有,可以使用哪些解决方法?
    • 原始 SQL 破坏了从特定数据库技术抽象的概念,并且其在当前 Entity Framework Core 中的使用非常笨重(但可能是最好的解决方案)
    • 对我来说,这看起来像是使用数据库 View 的一个很好的示例 - 同样,Entity Framework Core 并不真正支持(但可能是最好的解决方案)

最佳答案

如果您尝试对 LINQ 进行更直接的转换,会发生什么情况?

var latestState = from s in _context.States
group s by s.ID_T into sg
select new { ID_T = sg.Key, Time = sg.Time.Max() };

var ans = from t in _context.T
where t.FK == 1
join sub in latestState on t.ID equals sub.ID_T into subj
from sub in subj.DefaultIfEmpty()
join s in _context.States on new { t.ID, sub.Time } equals new { s.ID, s.Time } into sj
from s in sj.DefaultIfEmpty()
select new { t.ID, t.Description, State = (s == null ? 0 : s.State) };

显然 ?? 运算符将转换为 COALESCE 并且可以正确处理空表,因此您可以将 select 替换为:

          select new { t.ID, t.Description, State = s.State ?? 0 };

关于asp.net - 高效连接 Entity Framework Core 中另一个表的最新记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45420599/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com