不确定如何将数据正确提取到包含字符串、int 和 double 属性的类列表中



我正在使用 asp.net MVC,试图制作一个表格,显示每天的品牌总利润,在几天内,我正在努力包括品牌净利润为0的日子。

在我查询商店在给定时间范围内的购买总数后,在一个名为 purchaseQuery 的变量中,它给了我品牌名称、购买日期(作为整数(、该商品的价格以及在该交易中购买的所述商品的数量。假设每个品牌只销售一种产品,并且产品的价格每天都在波动。 此代码位于该查询之后。

purchasedItems = new List<BrandsTransactionItem>();
foreach (var query in purchaseQuery)
{
BrandsTransactionItem tempItem;
tempItem = purchasedItems.Where(e => e.day == query.day).Where(e => e.brandName == query.brandName).FirstOrDefault();
//If item not in list already, 
if (tempItem == null)
{
purchasedItems.Add(new BrandsTransactionItem()
{
brandName = query.brandName,
day = query.day,
totalPurchased = query.TotalPurchased,
costOfItem = query.costOfItem
});
}
// if it already exists, just add to amount purchased
else
{
tempItem.totalPurchased += query.totalPurchased;
}
}
foreach (var item in purchasedItems)
{
double dailyProfit = (double)(item.totalPurchased * item.costOfItem);
dailyProfit = Math.Round(dailyProfit, 2); // make it decimal of 2
// Items is the list that I want to display in MVC
Items.Add(new BrandsProfit(){
brandName = item.brandName,
day = item.day,
totalDailyProfit = dailyProfit
});
}

我想转换,以便 BrandsProfit 将有一个名称、一个日期列表和一个对应于这些日子的每日利润列表。这样,"商品"列表中的每件商品都将具有唯一的品牌名称,因为它将适用于每次购买,而不是仅适用于购买品牌商品的天数。

我觉得我把事情复杂化了,我主要担心的是,如果一个品牌一天有 0 次购买,我可能会有一个 5 码的天数列表,以及一个 4 码的购买清单,我需要它们的尺寸相同。

任何帮助不胜感激,并感谢您抽出宝贵时间阅读我的问题。

这类问题非常适合使用 LINQ。

下面的 LINQ 查询首先创建不同日期和品牌名称的外部联接。这为我们提供了可以加入的所有日期的所有品牌的列表。这样,每个品牌将有相同的天数,即使它从未在特定日期销售过任何商品。

然后,它会根据该品牌/天数列表加入购买,如果当天没有记录该品牌的购买记录,则使用DefaultIfEmpty创建零成本/数量的备用购买。

然后,该联接的结果将投影到BrandsProfit对象列表中。

例如,如果某一天没有购买某个品牌,您会在示例数据列表中注意到,第 2 天品牌"B"被注释掉了;但在结果中,第 2 天品牌"B"仍有一行,TotalDailyProfit 为零。

void Main()
{
var purchases = new List<Purchase>() {
new Purchase() { BrandName = "A", CostOfItem = 1.13M, Day = 1, TotalPurchased = 125 },
new Purchase() { BrandName = "B", CostOfItem = 1.52M, Day = 1, TotalPurchased = 165 },
new Purchase() { BrandName = "C", CostOfItem = 1.90M, Day = 1, TotalPurchased = 836 },
new Purchase() { BrandName = "A", CostOfItem = 1.74M, Day = 2, TotalPurchased = 583 },
//new Purchase() { BrandName = "B", CostOfItem = 1.52M, Day = 2, TotalPurchased = 785 },
new Purchase() { BrandName = "C", CostOfItem = 1.42M, Day = 2, TotalPurchased = 369 },
new Purchase() { BrandName = "A", CostOfItem = 1.93M, Day = 3, TotalPurchased = 789 },
new Purchase() { BrandName = "B", CostOfItem = 1.87M, Day = 3, TotalPurchased = 739 },
new Purchase() { BrandName = "C", CostOfItem = 1.78M, Day = 3, TotalPurchased = 436 },
};
var results = from day in purchases.Select(x => x.Day).Distinct()
from brand in purchases.Select(x => x.BrandName).Distinct()
join purchase in purchases on new { Brand = brand, Day = day } equals new { Brand = purchase.BrandName, Day = purchase.Day } into j
from result in j.DefaultIfEmpty(new Purchase() { BrandName = brand, Day = day, TotalPurchased = 0, CostOfItem = 0 })
select new BrandsProfit()
{
BrandName = result.BrandName,
Day = result.Day,
TotalDailyProfit = result.TotalPurchased * result.CostOfItem
};
Debug.WriteLine(JsonConvert.SerializeObject(results, Newtonsoft.Json.Formatting.Indented));
}
class Purchase
{
public string BrandName { get; set; }
public int Day { get; set; }
public int TotalPurchased { get; set; }
public decimal CostOfItem { get; set; }
}
class BrandsProfit
{
public string BrandName { get; set; }
public int Day { get; set; }
public decimal TotalDailyProfit { get; set; }
}

产生以下结果:-

[
{
"BrandName": "A",
"Day": 1,
"TotalDailyProfit": 141.25
},
{
"BrandName": "B",
"Day": 1,
"TotalDailyProfit": 250.80
},
{
"BrandName": "C",
"Day": 1,
"TotalDailyProfit": 1588.40
},
{
"BrandName": "A",
"Day": 2,
"TotalDailyProfit": 1014.42
},
{
"BrandName": "B",
"Day": 2,
"TotalDailyProfit": 0.0
},
{
"BrandName": "C",
"Day": 2,
"TotalDailyProfit": 523.98
},
{
"BrandName": "A",
"Day": 3,
"TotalDailyProfit": 1522.77
},
{
"BrandName": "B",
"Day": 3,
"TotalDailyProfit": 1381.93
},
{
"BrandName": "C",
"Day": 3,
"TotalDailyProfit": 776.08
}
]

如果您不想继续使用上面的例子,您可以考虑更新用于在purchaseQuery中生成数据的源查询,以使用类似于上面的外部联接...这样,您将对品牌/日期的每个组合都有一行,即使某个品牌从未在特定日期销售过。

最新更新