首页 > 解决方案 > 如何使两个联合的 LINQ 语句异步?

问题描述

        var primaryApplicationUsers = _context.ApplicationActivities
            .AsEnumerable()
            .Where(applicationActivity => TimeSince(applicationActivity.ApplicationUseDate).Days <= days)
            .Where(applicationActivity => applicationActivity.PatientApplication == primaryApplicationOfInterest)
            .Select(applicationActivity => applicationActivity.ApplicationUserId)
            .Distinct();

            var secondaryApplicationUserCount = _context.ApplicationActivities
                .AsEnumerable()
                .Where(applicationActivity => TimeSince(applicationActivity.ApplicationUseDate).Days <= days)
                .Where(applicationActivity => applicationActivity.PatientApplication == secondaryApplicationOfInterest)
                .Where(applicationActivity => primaryApplicationUsers.Any(primaryApplicationUser => primaryApplicationUser == applicationActivity.ApplicationUserId))
                .Select(applicationActivity => applicationActivity.ApplicationUserId)
                .Distinct()
                .Count();

上面的代码是我目前拥有的。我从第一个语句中获取标量数字列表,然后在第二个语句中我获取相同类型的信息,但我只想从第一个语句中获取包含标量数字列表的条目。

我不知道如何使这个语句异步。

标签: linqentity-framework-core

解决方案


一次性从外部源获取用户数据并返回比标量更复杂的数据可能更容易、性能更高。更复杂的对象应该提供您以后可以引用的属性。

var users = _context.ApplicationActivities
    .AsEnumerable()
    .Where(act => 
        TimeSince(act.ApplicationUseDate).Days <= days
        && act.PatientApplication == primaryApplicationOfInterest // optional, for performance
        && act.PatientApplication == secondaryApplicationOfInterest // optional, for performance
    )
    .GroupBy(act => act.ApplicationUserId)
    .Select(grp => new {
        ApplicationUserId = grp.Key,
        isPrimary = grp.Any(act => act.PatientApplication == primaryApplicationOfInterest),
        isSecondary = grp.Any(act => act.PatientApplication == secondaryApplicationOfInterest)
    })
    .ToList(); // execute it, so it only calls the server once even when 'users' is referenced multiple times

然后在其他逻辑中使用这些属性,现在可以更简单,因为它可以使用更具描述性的用户对象。

var primaryApplicationUsers = 
    users
    .Where(user => user.isPrimary)
    .Select(user => user.ApplicationUserId);

var secondaryApplicationUserCount = 
    users
    .Where(user => user.isPrimary && user.isSecondary) // you can do the 'any' approach but I believe this is equivalent
    .Count();

推荐阅读