linq - 如何使两个联合的 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();
上面的代码是我目前拥有的。我从第一个语句中获取标量数字列表,然后在第二个语句中我获取相同类型的信息,但我只想从第一个语句中获取包含标量数字列表的条目。
我不知道如何使这个语句异步。
解决方案
一次性从外部源获取用户数据并返回比标量更复杂的数据可能更容易、性能更高。更复杂的对象应该提供您以后可以引用的属性。
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();
推荐阅读
- android - Android导航架构组件-系统的后退按钮退出应用
- performance - Java 中 SimpleDateFormat 的错误处理
- javascript - 不使用本地时区偏移量的 iso 8601 字符串到可用的 d3 日期
- django - 一个列表和一个表单放到同一个django模板中
- python - xgboost 文档有误吗?(早期停止轮次以及最佳和最后一次迭代)
- mysql - XAMPP 访问被拒绝
- unity3d - AR 核心以统一方式动态加载预制件
- php - 在 Laravel 5.7 中加密并在 Codeigniter 3.1 中解密
- java - 当前值/单元格 POI 的 Excel 公式
- graalvm - nashorn CompiledScript graalvm 等效