2013-12-04 4 views
0

У меня есть модель/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

Будьте осторожны, сколько раз вы попадаете в базу данных. Первый подход, вероятно, окажется лучше, потому что вы можете написать один запрос linq для чтения и группировки или суммирования всех данных.

Измените строку подключения, чтобы добавить

Application Name=KrishApplication 

Open SQL Management Studio и использовать SQL Server Profiler, чтобы увидеть, что SQL звонки делаются.

(фильтр, где имя приложения, как KrishApplication ...)

Если у вас есть производительность цифры вы, вероятно, хотите, чтобы добавить их к вашим объектам диллеров. Разместить объявление ...

[NotMapped] 
public Performance Performance{get; set;} 

Убедитесь, что вы можете установить фильтр в своем классе-помощнике. Затем вы можете показывать производительность за прошлый квартал, год, год и т. Д. И если вам нужно отфильтровать только одного или даже одного Дилера, вы можете использовать для этого один и тот же вспомогательный класс.

ИЛИ ...

Если вы можете сделать все расчеты в 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(); 
  • Элемент списка
+0

Полностью согласен вас вас. Я собираюсь сделать вид в базе данных. – KrishnaDhungana

Смежные вопросы