Суммирование в многоуровневых отношениях

Вопрос:

Сначала используя EF-код, у меня есть следующие 4 объекта

public class Item {
public int Id { get; set; }
public string Name { get; set; }
}

public class Location {
public int Id { get; set; }
public string Name { get; set; }
}

public class InventoryAdjustment {
public int Id { get; set; }
public virtual Location Location { get; set; }
public virtual ICollection<AdjustmentLine> Lines { get; set; }
}

public class AdjustmentLine {
public int Id { get; set; }
public virtual Item Item { get; set; }
public int Quantity { get; set; }
}

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

Самое лучшее, что я достиг до сих пор:

using (var db = new InventoryContext()) {
var items = db.Items.ToList();
var locations = db.Locations.ToList();

foreach (var item in items) {
Console.WriteLine(item.Name+":");
foreach (var location in locations) {
Console.Write("\t" + location.Name + ": ");
var qty = db.InventoryAdjustments
.Where(p => p.Location.Id == location.Id)
.SelectMany(p => p.Lines)
.Where(p => p.Item.Id == item.Id)
.Select(p => (int?)p.Quantity)
.Sum();
Console.WriteLine(qty ?? 0);
}
}
Console.Read();
}

Вышеуказанные результаты:

Item1:
Location1: 2
Location2: 12
Location3: 21
Item2:
Location1: 4
Location2: 0
Location3: 0
Item3:
Location1: 1
Location2: 17
Location3: 0

Но с 3-мя позициями и тремя местоположениями в базе данных, приведенный выше код вызывает 11 вызовов в базе данных. 2 для получения предметов и местоположений и 9 для расчета суммы количества.

Есть ли лучший способ получить сумму с наименьшим количеством круговых поездок?

Лучший ответ:

Вероятно, это должно работать:

using (var db = new InventoryContext())
{
    var items = db.Items.ToList();
    var locations = db.Locations.ToList();

    items
        .Select(item =>
        {
            Console.WriteLine(item.Name + ":");
            return item;
        })
        .SelectMany(item => locations.Select(location => new { item, location }))
        .GroupJoin(
            db.InventoryAdjustments
                .SelectMany(
                    inventoryAdjustment => inventoryAdjustment.Lines.Select(
                        adjustmentLine => new { key = new { locationId = inventoryAdjustment.Location.Id, itemId = adjustmentLine.Item.Id }, adjustmentLine.Quantity }
                    )
                ),
            x => new { locationId = x.location.Id, itemId = x.item.Id },
            y => y.key,
            (x, y) =>
            {
                Console.WriteLine("\t {0}: {1}", x.location.Name, y.Sum(a => a.Quantity));
                return 0;
            }
        ).ToList();
    Console.Write("\nPress any key...");
    Console.ReadKey();
}

Оцените статью
TechArks.Ru
Добавить комментарий