我有一个这样的查询:
var foundData = await DatabaseContext.Set<TableA>()
.AsNoTracking()
.Where(x => list.Contains(x.Code))
.Select(x => x.Code)
.ToListAsync()
.ConfigureAwait(false);
var notFoundData = await DatabaseContext.Set<TableA>()
.AsNoTracking()
.Where(x => !list.Contains(x.Code))
.Select(x => x.Code)
.ToListAsync()
.ConfigureAwait(false);
由于这个查询两次访问数据库,我不想从数据库中检索所有记录,然后进行筛选。有没有可能有一个List<tuple>
,它可以像一样在一个查询中完成
假设数据库包含:
A,B,C,D,E
实际上,数据库包含数百万条记录。列表也是如此。
列表包含A、B、F
如此找到的列表将包含:A,B
而notFound将包含:F
所以期望的输出是var(find,notfind(=?
这对您有帮助吗?
var source = new List<string> { "A", "B", "C", "D", "E" };
var target = new List<string> { "A", "B", "F" };
var foundOrNot = target.Select(s => new { Value = s, Found = source.Contains(s) });
foreach(var entry in foundOrNot)
{
Console.WriteLine("Value: " + entry.Value + "; Found: " + entry.Found.ToString());
}
https://dotnetfiddle.net/KL9yfK
您可以执行以下操作:
List<string> records = new List<string> {"A", "B", "C", "D", "E"};
List<string> list = new List<string> {"A", "B", "F"};
var result = records
.GroupBy(r => list.Contains(r))
.ToDictionary(r => r.Key);
var (found, notfound) = (result.ContainsKey(true) ? result[true].Select(g => g) : new List<string>(),
result.ContainsKey(false) ? result[false].Select(g => g) : new List<string>());