在 LINQ 中将 table 数据分成 4 部分到 SQL

Divide table data in 4 parts in LINQ to SQL

我有一个 table 说 Offers 具有以下数据

Id   Name
1    A
2    B
3    C
4    D
5    E
6    F
7    G
8    H
9    I

我有 4 个 containers 也有这些 offers

现在我想创建一个像

这样的数据结构
Class Data 
{
    Public int containerID {get; set; }
    public ICollection<Offers> offers { get; set; }
}

我想遍历此 offers table 并将每个商品一一分配给容器。

例如,报价 A 转到 Container1B 转到 Container2C 转到 Container3D 转到 Container4。再次 E 转到 Container1 等等。

我想要 class Data 中的 list 输入我的场景。

我已经尝试了以下代码,但我知道我离解决方案还差得很远。

 var data = context.tbl_offer.Where(x => x.INT_IS_PRIME == 1 && x.DAT_START_OFFER <= dat && x.DAT_END_OFFER >= dat)
                      .Select(z => new { 
                          offerID = z.Id,                             
                          offerName = z.Name

                      });

有什么想法吗?

//select data
var data = context.tbl_offer.Where(x => x.INT_IS_PRIME == 1 && x.DAT_START_OFFER <= dat && x.DAT_END_OFFER >= dat);

var containers = new List<Data>();
//add 4 containers
containers.Add(new Data() {
    containerId = 1,
    offers = new List<Offers>()
});
containers.Add(new Data() {
    containerId = 2,
    offers = new List<Offers>()
});
containers.Add(new Data() {
    containerId = 3,
    offers = new List<Offers>()
});
containers.Add(new Data() {
    containerId = 4,
    offers = new List<Offers>()
});

//assign the offers to the containers
for(int i = 0; i < data.Count(); i++){
    int index = i % containers.Count;
    containers[index].offers.Add(data.ElementAt(i));
}

请记住,如果您需要 Offers 的实例,则不能使用匿名 class。因此我删除了

Select(z => new { 
    offerID = z.Id,                             
    offerName = z.Name
});

如果我对你的问题理解正确的话,你似乎可以使用分组依据:

var result = list.Select((x, i) => new { Index = i % 4 + 1, Value = x })
                 .GroupBy(x => x.Index)
                 .Select(x => new Data()
                 {
                     containerID = x.Key,
                     offers = x.Select(a => a.Value).ToList()
                 });

使用此数据:

var list = new List<Offers>{
    new Offers(){Id=1, Name="A"},
    //...
    new Offers(){Id=9, Name="I"},
};

结果将是:

Group 1: A, E, I
Group 2: B, F
Group 3: C, G
Group 4: D, H

因此,如果您按照您的描述看到每 4 条记录(如果您考虑起始索引 0)将进入 Container1。所以 Container1 将包含 A,E,.

因此,您可以构建一个通用逻辑,它会像这样为您提取容器中的 1 到 4 个项目,只是您的第 n 个值会有所不同。

int nth=4;
var container1ids = context.tbl_offer
            .Select(x => x.Id)
            .ToArray()
            .Where((x, n) => n % nth == 0)
            .ToArray();

现在查询包含这些id的offer来获取container1记录

var conatiner1Records = context.tbl_offer.Where(x => container1ids.Contains(x.Id));

希望对您有所帮助。