在 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
转到 Container1
,B
转到 Container2
,C
转到 Container3
,D
转到 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));
希望对您有所帮助。
我有一个 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
转到 Container1
,B
转到 Container2
,C
转到 Container3
,D
转到 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));
希望对您有所帮助。