Итак, у вас есть PurchaseProducts
и ProductStocks
, и между ними существует отношение один ко многим: каждый PurchaseProduct
имеет ноль или более ProductStocks
, каждый ProductStock
принадлежит ровно одному PurchaseProduct
: тот, на который указывает внешний ключ PurchaseProductId
.
Каждый PurchaseProduct
также имеет по крайней мере два свойства, например, A и B. Каждый ProductStock
имеет по крайней мере свойство C.
Требование : дайте мне от каждого Покупки ProductProduct со всеми его Товарными запасами сумму A и B и все ее ProductStocks C
Если вы следовали первым соглашениям кода платформы сущностей, у вас будет нечто подобное, как показано ниже
class PurchaseProduct
{
public int Id {get; set;}
public double A {get; set;}
public double B {get; set;}
...
// every PurchaseProduct has zero or more ProductStocks (one-to-many)
public virtual ICollection<ProductStock> ProductStocks {get; set;}
}
class ProductStock
{
public int Id {get; set;}
public double C {get; set;}
...
// every ProductStock belongs to exactly one PurchaseProduct, using foreign key
public int PurchaseProductId {get; set;}
public virtual PurchaseProduct PurchaseProduct {get; set;}
}
class MyDbContext : DbContext
{
public DbSet<PurchaseProduct> PurchaseProducts {get; set;}
public DbSet<ProductStock> ProductStocks {get; set;}
}
Это все, что должна знать структура сущностей, чтобы обнаружить ваши таблицы, столбцы в таблицах, отношения между таблицами и первичным и внешним ключами.
В структуре сущностей столбцы таблиц представлены не виртуальными свойствами. Виртуальные свойства представляют отношения между таблицами (один ко многим, многие ко многим, ...)
Определив ваши классы, ваш запрос прост.
var result = myDbContext.PurchaseProducts
.Where(purchaseProduct => ...) // only if you don't want all PurchaseProducts
// from every remaining PurchaseProduct calculate A + B + Sum(all C of its ProductStocks)
.Select(purchaseProduct => purchaseProduct.A + purchaseProduct.B
+ purchaseProduct.ProductStocks
.Select(productStock => productStock.C)
.Sum());
Платформа сущностей знает связь между PurchaseProducts и ProductStocks и знает, что требуется группа Присоединение.
Обратите внимание, что каждая покупка продукта имеет A и B. Вы всегда получите как минимум A + B. Если товар покупки не имеет вообще никаких товарных запасов, тогда покупка товара. Товар будет пустой коллекцией. Выбор и сумма приведут к нулевому значению.
Некоторые люди не доверяют инфраструктуре сущностей и предпочитают сами объединяться в группы:
var result = myDbContext.PurchaseProducts.GroupJoin(
myDbContext.ProductStocks,
purchaseProduct => purchaseProduct.Id, // from every PurchaseProduct take the Id
productStock => productStock.PurchaseProductId, // from every ProductStock take the foreign key
// ResultSelector: from every PurchaseProducts, with all its matching ProductStocks
// calculate A + B + Sum of all C of the productStocks
(purchaseProduct, productStocksOfThisPurchaseProduct) =>
purchaseProduct.A + purchaseProduct.B +
productStocksOfThisPurchaseProduct.Select(productStock => productStock.C).Sum());
Simple Comme Bonjour!