关于模型设计的建议

时间:2013-12-04 10:21:42

标签: asp.net-mvc oop poco

我有一个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));
}

现在我对两者都不满意。在一种方法中,我在一个帮助程序类中执行所有操作,但在其他方法中,每次为每个用户调用不同的表。真的很感激,如果有人能指导我一个更好的解决方案。谢谢!

1 个答案:

答案 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();
  • 列表项