LINQ в совокупности на объект и список


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

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

"оценка" может иметь несколько "оценочных элементов" (Количество, Цена и ProductId)

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

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

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

Спасибо,

Введите описание изображения здесь

Введите описание изображения здесь

2 2

2 ответа:

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

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>, содержащий все EstimationItem, принадлежащие к оценке с тем же кодом.

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

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

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();
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 }); 
}