我有一个带有键的字典和一个列表(如果模型是作为值的话),如下面的示例数据:
var dataDictionary = new Dictionary<string, List<Model>>
{
{
"X1", new List<Model>
{
new Model { Name = "N1"},
new Model { Name = "N2"},
new Model { Name = "N3"}
}
},
{
"X2", new List<Model>
{
new Model { Name = "N1"},
}
}
};
在上面的例子中,我有3+1 = 4
模型。
以下是我的要求:
(从X1 WHERE =N1选择*),(从X1 WHERE =N2选择*),(从X1 WHERE Name =N3选择*,从X2 WHERE =N1选择*),
(从X1 WHERE =N1选择*),(从X1 WHERE =N2选择*),(从X1 WHERE Name =N3选择*,从X2 WHERE =N1选择*),
下面是我的尝试,但是对于批处理大小= 2,它给了我3个查询,如何聚合X1
和X2
数据,并且只为所有4个条目生成2个查询?
var queries = new List<string>();
foreach (var (key, value) in dataDictionary)
{
foreach (var lstModel in value.Batch(2))
{
var query = string.Empty;
foreach (var val in lstModel)
{
query += $"(SELECT * FROM {key} WHERE Name = {val.Name}),";
}
queries.Add(query);
}
}
这是我的模型和扩展课,
public class Model
{
public string Name { get; set; }
}
public static class EnumerableExtensions
{
public static IEnumerable<IEnumerable<T>> Batch<T>(this IEnumerable<T> items, int maxItems)
{
return items.Select((item, inx) => new { item, inx })
.GroupBy(x => x.inx / maxItems)
.Select(g => g.Select(x => x.item));
}
}
发布于 2021-05-22 14:56:00
你可以试试这样的东西。将字典压平成简单的IEnumerable,然后根据批处理大小进行批处理。
var BATCH_SIZE = 4;
var queries = new List<string>();
var items = dataDictionary.SelectMany(kv => kv.Value.Select(model => Tuple.Create(kv.Key, model)));
var currentbatchSize = 0;
var batchedQuery = string.Empty;
foreach (var item in items)
{
batchedQuery += $"(SELECT * FROM {item.Item1} WHERE Name = {item.Item2.Name}),";
if (currentbatchSize == BATCH_SIZE - 1)
{
queries.Add(batchedQuery);
batchedQuery = string.Empty;
currentbatchSize = 0;
continue;
}
currentbatchSize++;
}
https://stackoverflow.com/questions/67650674
复制相似问题