首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >需要根据批处理大小准备查询

需要根据批处理大小准备查询
EN

Stack Overflow用户
提问于 2021-05-22 14:34:17
回答 1查看 62关注 0票数 0

我有一个带有键的字典和一个列表(如果模型是作为值的话),如下面的示例数据:

代码语言:javascript
运行
复制
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模型。

以下是我的要求:

  • 如果批处理大小= 2,则需要从所有4个项准备2个查询。

(从X1 WHERE =N1选择*),(从X1 WHERE =N2选择*),(从X1 WHERE Name =N3选择*,从X2 WHERE =N1选择*),

  • 如果批处理大小=4或更高,则需要从所有4项中准备1次查询。

(从X1 WHERE =N1选择*),(从X1 WHERE =N2选择*),(从X1 WHERE Name =N3选择*,从X2 WHERE =N1选择*),

下面是我的尝试,但是对于批处理大小= 2,它给了我3个查询,如何聚合X1X2数据,并且只为所有4个条目生成2个查询?

代码语言:javascript
运行
复制
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);
    }
} 

这是我的模型和扩展课,

代码语言:javascript
运行
复制
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));
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-22 14:56:00

你可以试试这样的东西。将字典压平成简单的IEnumerable,然后根据批处理大小进行批处理。

代码语言:javascript
运行
复制
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++;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67650674

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档