我有一个Model / POCO,它具有收入,资产比率,回报等属性,这些属性是用户的绩效管理指标。每个属性都是根据公式计算的。其中大多数需要查询不同的表来填充数据以进行计算。目前我有两种方法:
public class Performance
{
public decimal Revenue {get; set;}
public decimal AssetRatio {get; set;}
// And so on
}
case 1
public class Helper
{
public List<Performance> GetPerformance()
{
var context = new SomeDbContext();
var revenue = context.Where(). some operation
var assetRatio = context.Where().. so on
//Each will have collection of user and performance indicator type.
//Eg: revenue is a list of users and revenue
//Now I Join all tables based on userId and create List<Performance>
//And return List<Performance>
}
}
I find this approach tedious and I tried another approach
case 2
public class Performance
{
private SomeDbContext _ctx = new SomeDataContext();
public SomeDbContext(int userId)
{
this.UserId = userId;
}
public int UserId {get; set;}
public decimal Revenue {get; set;}
public decimal AssetRatio {get; set;}
// And so on
// I have Private Methods that is dedicated to populate each associated property
private decimal getRevenue()
{
decimal revenue = ctx. ../ and so on
}
}
//This class is passed list of user id as list<int>
foreach (var user in UserList)
{
someList.Add(new Performance(user));
}
现在我对两者都不满意。在一种方法中,我在一个帮助程序类中执行所有操作,但在其他方法中,每次为每个用户调用不同的表。真的很感激,如果有人能指导我一个更好的解决方案。谢谢!
答案 0 :(得分:1)
请注意您点击数据库的次数。第一种方法可能会变得更好,因为您可以编写一个linq查询来读取和分组或汇总所有数据。
更改连接字符串以添加
Application Name=KrishApplication
打开SQL Management Studio并使用SQL Server Profiler查看正在进行的SQL调用。
(过滤应用程序名称如KrishApplication ...)
当您有性能数据时,您可能希望将它们添加到您的经销商对象中。添加此属性...
[NotMapped]
public Performance Performance{get; set;}
确保您可以在Helper类上设置过滤器。然后,您可以显示过去的季度,年份,年份等的表现。如果您需要过滤一些甚至只有一个经销商,那么您可以使用相同的助手类。
... OR
如果你可以在SQL中进行所有计算,那么这可能是最好的方法。您甚至可以编写存储过程或视图,以便一次性获取所有经销商及其性能统计数据。
create view DealersPlus as
select DealerId, DealerName, (select sum(Amount) from tblDeal dd
where dd.DealerId = d.DealerId) Amount
from tblDealers d
并填充
var dealers = SomeDbContext.Database
.SqlQuery<DealerPlus>("select * from DealersPlus")
.ToList();