c# - 使用组和连接在两个索引表上与一个组合选择的单独 LINQ2SQL 选择的性能
问题描述
我需要从按 ID 分组的表 (tab_activities) 中检索记录,只有按日期确定的每个组的最新记录。在这些最新记录中,我只需要那些尚未设置特定属性(已完成)的记录。最后,我必须交叉检查是否有任何活动也注册在黑名单(tab_flaggedActivities)中,然后对所有未完成且未标记的活动进行操作。
两个表都有关于 id 的索引。显然,id 不是主键。
我不确定我正在做的是否是设置此选择的最有效方式。将这些单独的选择组合在一个选择中会更好吗?如果是,我会怎么做?
// Retrieve only the latest activity entry of each known activity-ID
var latestActivityRecords = from activity in dc.tab_activities
where activity.dateRegistered > DateTime.Now.AddDays(-MaxAge)
group activity by activity.id
into groups
select groups.OrderByDescending(p => p.dateRegistered).First();
// Filter activities that are not finished
var unfinishedActivityRecords = from activity in latestActivityRecords
where !activity.finished
select activity;
// Check if any of those are in blacklist (different table)
var flaggedActivityRecords = from activity in unfinishedActivityRecords
join flaggedActivity in dc.tab_flaggedActivities
on activity.id equals flaggedActivity.id
select activity;
if (unfinishedActivities != null)
{
// Do something with all unfinished / unflagged activities
foreach (var activityRecord in unfinishedActivityRecords)
{
if (!flaggedActivityRecords.Any(p => p.id == activityRecord.id))
{
DoSomething(activityRecord);
}
}
}
解决方案
如果您的意思是将if
Any
测试与查询结合起来,您可以反转最后一个查询的含义,然后循环遍历结果,在数据库服务器上执行过滤:
var unflaggedActivityRecords = from activity in unfinishedActivityRecords
where !dc.tab_flaggedActivities.Select(fa => fa.id).Contains(activity.id)
select activity;
if (unfinishedActivities != null) {
// Do something with all unfinished / unflagged activities
foreach (var activityRecord in unflaggedActivityRecords) {
DoSomething(activityRecord);
}
}
推荐阅读
- sql - 当另一个连接已经使用同一个表时,Oracle 可以返回超时吗?
- oracle - ORA-00918 在视图中具有唯一的列名
- android - Flutter:Raw Material Button 和 Material Button 的区别
- javascript - MUI Select - 更改选择大小
- python - 如何使用 Naked 在 Python 中正确捕获 Node js 脚本的错误?
- scalafx - ScalaFx Group 包裹节点数据提取
- azure - Azure DevOps 托管代理上的 Azure 功能包?
- java - 从单独的控制器类中键绑定 JPanel
- angular - 具有嵌套 JSON 结构的 Angular MatOptGroup 自动完成
- r - 在 R 中将溢出表导出到 Excel