C# 在两个索引表上使用group和join的单独LINQ2SQL选择与一个组合选择的性能

C# 在两个索引表上使用group和join的单独LINQ2SQL选择与一个组合选择的性能,c#,sql-server,linq-to-sql,C#,Sql Server,Linq To Sql,我需要从一个表(tab_活动)中检索记录,该表按ID分组,仅由日期确定每个组的最新记录。 在这些最新记录中,我只需要那些具有特定属性(已完成)但尚未设置的记录。 最后,我必须交叉检查是否有任何活动也注册在黑名单(tab_flaggedActivities)中,然后对所有未完成且未标记的活动执行某些操作 两个表的id上都有索引。 显然,id不是主键 我不确定我所做的是否是设置此select的最有效的方法。 将这些单独的选择组合在一个选择中是否更好?如果是,我会怎么做 // Retrieve onl

我需要从一个表(tab_活动)中检索记录,该表按ID分组,仅由日期确定每个组的最新记录。 在这些最新记录中,我只需要那些具有特定属性(已完成)但尚未设置的记录。 最后,我必须交叉检查是否有任何活动也注册在黑名单(tab_flaggedActivities)中,然后对所有未完成且未标记的活动执行某些操作

两个表的id上都有索引。 显然,id不是主键

我不确定我所做的是否是设置此select的最有效的方法。 将这些单独的选择组合在一个选择中是否更好?如果是,我会怎么做

// 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);
    }
}

您所做的是在发送到数据库之前将查询合并到单个查询中。检查
latestActivityRecords
unfinishedActivityRecords
的类型。由于您没有执行任何导致查询执行的操作,因此执行将推迟到使用
Any
测试的
foreach
if
中的迭代。但是,由于
Any
测试是在一个循环中进行的,因此您应该通过添加
.ToList()
或者根据大小选择(a=>a.id).ToHashSet()(在这种情况下,您还可以执行
unfinishedActivityRecords
)来在分配中执行一次
标记的活动记录.什么是
未完成的活动