Линк Агрегат по объекту и списку - PullRequest
2 голосов
/ 29 июня 2011

Я делаю этот запрос с NHibernate:

    var test = _session.CreateCriteria(typeof(Estimation))
                .SetFetchMode("EstimationItems", FetchMode.Eager)
                .List();

«Оценка» может иметь несколько «Элементов оценки» (количество, цена и идентификатор продукта)

Я бы хотел список "Оценки" с этими ограничениями:

  1. Одна строка с кодом «Оценка» на картинке (например: 2011/0001 и 2011/0003)
  2. По оценке (означает в каждой строке) количество «EsvaluationItems»
  3. По оценке (означает в каждой строке) общую цену (Количество * Цена) для каждого "EstimaItems"

Я надеюсь, что структура будет более ясной с изображением ниже.

Спасибо

enter image description here

enter image description here

Ответы [ 2 ]

2 голосов
/ 29 июня 2011

Вот предложение:

var stats =
    from estimation in test
    group estimation by estimation.code into gestimation
    let allItems = gestimation.SelectMany(x => x.EstimationItems)
    select new 
        {
            Code = gestimation.Key,
            ItemNumber = allItems.Count(),
            TotalPrice = allItems.Sum(item => item.Price * item.Quantity)
        };

Теперь это создает анонимный тип с тремя требуемыми свойствами (код оценки, количество элементов для этого кода оценки и общая стоимость элементов для этогокод оценки).

Вы можете адаптировать его к конкретным потребностям.Просто имейте в виду, что allItems - это IEnumerable<EtimationItem>, содержащий все EsificationItem, принадлежащие Оценке с тем же кодом.

Если вы хотите использовать этот объект вне области метода его создания, чтоЕсли вы не используете анонимные типы, вы должны создать класс для хранения этих значений.

Исправленное предложение: предложение:

var stats =
    (from est in test.Cast<Estimation>()
    group est by est.code into gEst
    let allItems = gEst.SelectMany(est => est.EstimationItems).Cast<EstimationItem>()
    select new TestingUI
        {
            Code = gEst.Key,
            Quantity = gEst.Count(),
            Total = gEst.Sum(item => item.Price * item.Quantity)
        }).ToList();
0 голосов
/ 29 июня 2011
Dictionary<string, Tuple<int,decimal>> dico = new Dictionary<string, Tuple<int,decimal>>();
foreach (var itemEstimation in test)
{
    Estimation estimation = (Estimation)itemEstimation;
    if (dico.ContainsKey(estimation.Code) == false)
    {
        decimal total = 0;
        foreach (var item in estimation.EstimationItems)
        {
            EstimationItem estimationItem = (EstimationItem)item;
            total += item.Price * item.Quantity;
        }
        dico.Add(estimation.Code, new Tuple<int, decimal>(estimation.EstimationItems.Sum(x => x.Quantity), total));
    }
}

List<TestingUI> finalResult = new List<TestingUI>();
foreach (var item in dico)
{
    Tuple<int, decimal> result;
    dico.TryGetValue(item.Key, out result);
    finalResult.Add(new TestingUI() { Code = item.Key, Quantity = result.Item1, Total = result.Item2 }); 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...