c# - 如何将 2 个 db 调用合并为一个
问题描述
如何将以下 2 个 db 调用合并为一个。有可能吗?
IEnumerable<int> NewIds= Table1.NewValue.Split(',')
.Where(x => int.TryParse(x, out int num))
.Select(int.Parse)
.ToList();
if (NewIds!= null && NewIds.Count() > 0)
{
NewValue = string.Join(",", _context.table1.Where(x => NewIds.Contains(x.Id))
.Select(x => TempTextHelper.L(x.Name)));
}
IEnumerable<int> oldIds = Table1.OldValue.Split(',')
.Where(x => int.TryParse(x, out int num))
.Select(int.Parse)
.ToList();
if (oldIds != null && oldIds.Count() > 0)
{
OldValue = string.Join(",", _context.table1.Where(x => oldIds.Contains(x.Id))
.Select(x => TempTextHelper.L(x.Name)));
}
谢谢并恭祝安康,
解决方案
为了避免逻辑重复,创建一个从字符串值获取 id 的方法。您还可以避免将每个字符串解析两次,并将解析结果聚合到哈希集。很好的方法是扩展方法:
public static class Extensions
{
public static HashSet<int> GetIds(this string value) =>
value.Split(',').Aggregate(new HashSet<int>(),
(acc, s) => { if (Int32.TryParse(s, out int x)) acc.Add(x); return acc; });
}
另外我会在同一个类中添加第二个辅助方法(见后面的用法):
public static string CreateValue(this IEnumerable<KeyValuePair<int, string>> items) =>
String.Join(',', items.Select(kvp => TempTextHelper.L(kvp.Value)));
现在获取所有 id 并查询所有内容,但也将 Id 包含到结果中:
var newIds = Table1.NewValue.GetIds();
var oldIds = Table1.OldValue.GetIds();
var ids = newIds.Union(oldIds).ToList(); // combine two sets of ids
if (ids.Any())
{
// Single DB call
var allResults =
_context.table1.Where(x => ids.Contains(x.Id)).ToDictionary(x => x.Id, x => x.Name);
NewValue = allResults.Where(kvp => newIds.Contains(kvp.Key)).CreateValue();
OldValue = allResults.Where(kvp => oldIds.Contains(kvp.Key)).CreateValue();
}
推荐阅读
- python - 行号和输入问题
- javascript - 给定一个匹配数组,找到至少有一个匹配的所有文档,并将所有匹配替换为给定值
- c++ - IDirectMusicPerformance8 - 仅 MIDI,还是 WAV?
- c++ - 导入多个模块会导致构建失败 - C2664
- drag-and-drop - primeng p-tree 拖放防止删除原始节点
- flutter - 如何在 ExpansionPanelList 中只制作一个与其他扩展面板不同的扩展面板?扑
- kubernetes - 无法规范化 EKS 集群中的地址
- python - Flask-SQLAlchemy 自定义顺序,在同一个表上具有多个连接
- microsoft-graph-api - 是否可以通过 MS Graph API 在公用文件夹日历上创建、更新和删除事件?
- javascript - 当用户使用 React Router 点击一个类别时,我如何打开一个新网页?