从具有重复数据的SQL结果中创建键值对

问题描述 投票:1回答:3

目前,我的问题是我从SQL查询返回结果,返回的结果如下:

125 Month   10.00   Wholesale
125 Year    20.00   Wholesale
126 Month   20.00   Wholesale
126 Year    30.00   Wholesale
127 Month   40.00   Wholesale
127 Year    50.00   Wholesale

其中整数列是该列的ID。当数据返回到C#调用代码时,它将放置在遵循此结构的对象中:

ProductTermAndPricingDataItem A:

public int ProductID { get; set; }
public string BillingPeriodName { get; set; }
public decimal PriceAmount { get; set; }
public string PriceTypeName { get; set; }

然后我需要将该对象转换为遵循这种格式的另一个对象:

public class ProductPricingGetDataItem : IDataItem
{

    public int ProductID { get; set; }    
    private List<Terms> _terms = new List<Terms>();
    public List<Terms> Terms
    {
        get => _terms;
        set => _terms = value;
    }
}

public partial class Terms {
    public string Term { get; set; }
    public decimal Price { get; set; }
}

其中条款= BillingPerioidName,而价格= PriceAmount。我不确定执行此操作的最佳方法。我当前的代码是:

           foreach (ProductTermAndPricingDataItem item in productInformationItems)
        {
            ProductPricingGetDataItem productPricingGetDataItem = new ProductPricingGetDataItem();

            productPricingGetDataItem.ProductID = item.ProductID;
            productPricingGetDataItem.ProductName = item.ProductName;
        }

我只是在如何创建术语而不引起无数循环的情况下遇到问题。

c# sql keyvaluepair
3个回答
1
投票

您可以使用Linq和GroupBy

List<ProductPricingGetDataItem> grouped = productInformationItems.GroupBy(
                                        p => p.ProductID,
                                        (key, g) => new ProductPricingGetDataItem() { ProductID = key, Terms = g.Select(x => new Terms(x.BillingPeriodName, x.PriceAmount)).ToList() }).ToList();

为了使该代码正常工作,您需要向Terms添加一个构造函数:

public Terms(string term, decimal price)
{
    Term = term;
    Price = price;
}

带有工作示例的小提琴:https://dotnetfiddle.net/EE2BpP


1
投票

您可以使用Dictionary来创建键值对。键是ProductID,值是Terms的列表。

var dictionary = new Dictionary<int, List<Terms>>();
foreach (ProductTermAndPricingDataItem item in productInformationItems)
{
            if(dictionary.ContainsKey(item.ProductID))
            {
                dictionary[item.ProductID].Add(new Terms { Term = item.BillingPeriodName, Price = item.PriceAmount});
            }
            else
            {
                dictionary.Add(item.ProductID, new List<Terms>() { new Terms() {Term = item.BillingPeriodName, Price = item.PriceAmount             } });
            }  
 }

0
投票

对于LINQ爱好者:

//Your initial data list
var productInformationItems = new List<ProductTermAndPricingDataItem>();
var productPricingGetDataItems = productInformationItems.ToLookup(item => item.ProductID)
                                                        .Select(grouping => new ProductPricingGetDataItem
                                                        {
                                                            ProductID = grouping.Key,
                                                            Terms = grouping.Select(item => new Terms
                                                            {
                                                                Price = item.PriceAmount,
                                                                Term = item.BillingPeriodName
                                                            }).ToList()
                                                        }).ToList();

在您的确切情况下,结果是:

enter image description here

随时询问是否不清楚。

© www.soinside.com 2019 - 2024. All rights reserved.