我的数据库中有一个表,其中包含'price','percentage'和'ID'列。 需要使用colum'price'和'id'计算百分比列。有一个初始价格,然后是三个增加的价格,所有这些都具有相同的ID。我需要找到一个使用C#计算数据库中百分比列的方法。
我附上一张图片,以便更好地了解它应该如何。 我正在使用Linq编写一个导入系统,我已经导入了所有列,但现在我需要计算增加价格的百分比,我真的很喜欢这个。也许某人有一些关于如何解决这个问题的上帝建议。
更新:
public static void calculateProcentage(string id, double price, double, double percentage)
{
var percentageQuerry = from l in db.Table
where l.ID == id
&& l.Price == price && l.Percentage != percentage
select l;
foreach (Table l in percentageQuerry)
{
//double newPercentage = (double) l.Percentage;
//DataTable table = new DataTable();
// int rowCount = table.Rows.Count;
DataGridView dataGridView = new DataGridView();
for (int i = 0; i < dataGridView.Rows.Count; i++)
{
if (l.Building_vigor_ID == building_vigor_id)
{
//var priceRows = db.V_Leases.Select(x => x.Price_sqm).ToList();
// get a list of the rows of the price column
// get a list of the rows of the price column
var priceRows = (from r in db.Table
select r.Price).ToList();
percentage = (double)(priceRows[i] / priceRows[i + 1]);
}
}
}
try
{
db.SubmitChanges();
Console.Write("Percentage updated");
//Console.ReadKey();
}
catch (Exception e)
{
Console.WriteLine(e);
Console.Write("Could not update percentage");
//Console.ReadKey();
}
}
这就是我的尝试。我低音想把它变成一个只更新列百分比的更新方法。但没有实际工作。 Linq母猪我很新,可能是这里写的一些不好的代码。
答案 0 :(得分:0)
我对Linq母猪很新,可能是这里写的一些不好的代码。
你的问题,以及你试图解决这个问题的方式,充满了不一致和看似矛盾的期望。
就目前而言,由于缺乏信息,您提出的问题无法解决。但是,我确实认为我理解你要解决的实际问题是什么,所以我会给你答案。但首先,让我解释一下我是如何解释你的问题的。
根据我的理解,您尝试根据之前的值计算百分比。
一个更通用的例子:
PRICE % ID
------------------------
100 A 1
103 B 1
100 C 2
150 D 2
我的以下答案将假设这是正确的。
您的预期值也存在问题。在您的示例中,您已将19.79(与19.21相比)的百分比列为 0.3 。
这根本不符合逻辑。差异 3%。在百分比列中有两种不同的(可接受的)方法来表示这一点:
3
,因为它以百分比表示( 3 %)0.03
,因为它表示为十进制值(3%= 0.03 )您对0.3
的使用毫无意义,因为我将此解释为 0.3%(选项1)或 30%(选项2)。
为了保持一致性,我的答案将假设您需要小数值(上例中的0.03
)
我假设您的数据类构造如下:
public class Foo
{
public decimal Price { get; set; }
public decimal Percentage { get; set; }
public int ID { get; set; }
}
我不太明白你是如何使用这种方法的。您提供了三个参数(string id, double price, double, double percentage
),但随后您继续按如下方式选择数据:
var percentageQuerry = from l in db.Table
where l.ID == id
&& l.Price == price && l.Percentage != percentage
select l;
提供百分比毫无意义,然后从该百分比中选择不同的所有内容。你不知道你将获得什么数据,以什么顺序,以及找到的条目是否在你提到的百分比之前或之后。
相反,我的回答是重新计算给定ID 的所有百分比的方法。这似乎是一个更清晰的算法。
检索数据
你的尝试是新旧技术(LINQ,DataTable)的奇怪组合,我将完全使用LINQ,因为我觉得DataTable
的使用在这里是没有根据的。
public static void CalculatePercentagesForID(int id)
{
Foo[] rows = db.Table.Where(x => x.ID == id).ToArray();
//... (see the next code block)
}
这简单得多。请注意,我假设您希望根据它们出现在数据库中的订单来处理这些条目。如果您需要根据其他内容(例如Foo
个对象中的日期值)对其进行排序,则必须使用额外的OrderBy
,例如:
Foo[] rows = db.Table.Where(x => x.ID == id).Orderby(x => x.DateCreated).ToArray();
处理数据
重要的是要注意,百分比是从两个(后续)行计算的。
//The first entry is always the "base" price, therefore always 0.
rows[0].Percentage = 0;
for(int i = 1; i < rows.Length; i++)
{
var previous = rows[i-1];
var current = rows[i];
current.Percentage = CalculateDifferenceInPercentage(previous.Price, current.Price);
}
//TODO: save all the objects in "rows" back to the database!
注意for
循环如何从1开始,而不是从0开始。我们跳过第0步,因为无论如何第一个元素自动为0。 for
循环只会处理第一行之后的每一行。
计算百分比
public static Decimal CalculateDifferenceInPercentage(decimal oldPrice, decimal newPrice)
{
//1.The elaborate calculation
//The comments are example output when oldPrice = 19.21, newPrice = 19.79
var theRatio = newPrice / oldPrice;
// = 1.0301...
var theRatioRounded = Math.Round(theRatio,2);
// = 1.03
var thePercentageDifference = theRatioRounded - 1;
// = 0.03
return thePercentageDifference;
}
或者,如果您想要更短(但更难阅读)的版本:
public static Decimal CalculateDifferenceInPercentage(decimal oldPrice, decimal newPrice)
{
return Math.Round(newPrice / oldPrice , 2) - 1;
}
为简单起见,我省略了一些空检查,例如检查是否有任何行返回。
我省略了如何在数据库中保存更新的实体,因为它与您关于计算百分比的实际问题无关。
这适用于负百分比和正百分比。