LINQ в совокупности на объект и список
Я делаю этот запрос с NHibernate:
var test = _session.CreateCriteria(typeof(Estimation))
.SetFetchMode("EstimationItems", FetchMode.Eager)
.List();
"оценка" может иметь несколько "оценочных элементов" (Количество, Цена и ProductId)
Я хотел бы получить список "оценок" с этими ограничениями:
- одна строка кода "оценка" на картинке (например : 2011/0001 и 2011/0003)
- по оценке (означает на каждой строке) число "оценок"
- по оценке (означает на каждой строке) общая цена (Количество * Цена) для каждого "EstimationItems"
Я надеюсь, что структура будет более ясной с изображением ниже.
Спасибо,
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 }); }