Сумма двух столбцов из другой таблицы, и она должна вернуть результат, если во вторичной таблице нет данных - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть две таблицы: Tb_PurchaseProductDetail (первичный ключ: id), tb_productstockupdate (внешний ключ: PurchaseProductId (связанный с первичным ключом таблицы Tb_PurchaseProductDetail)). Теперь я хочу сумму двух значений столбца таблицы Tb_PurchaseProductDetail и одного столбца таблицы tb_productstockupdate в Relationship (). Приведенный ниже запрос дает мне правильные данные, если в таблице tb_productstockupdate существует какая-либо отдельная строка, но если в таблице tb_productstockupdate нет данных, то данные из первичной таблицы не возвращаются.

Я ожидаю, что если во вторичной таблице нет данных, то по крайней мере она должна возвращать данные на основе первичной таблицы.

s.tb_productstockupdate.Sum(d => d.StockDifference))

код выше должен возвращать 0 вместо нуля.

Ниже приведен код, который я использую. Я не знаю, что мне не хватает.

connectionObj.Tb_PurchaseProductDetail.Where(s => s.ProductId == prodcutId && ((s.Quantity + s.DiscountQuantity + s.tb_productstockupdate.Sum(d => d.StockDifference)) > s.SoldPackQuantity)).Select(s => new SelectListItem()
            {
                Text = s.BatchNumber + " [(" + (s.Quantity + s.DiscountQuantity + s.tb_productstockupdate.Sum(d => d.StockDifference) - s.SoldPackQuantity) + ") & " + s.ExpiryDate + "]",
                Value = s.Id.ToString()
            }).ToList();

Ниже код решил мою проблему. Я использовал Any (), чтобы проверить, есть ли во вторичной таблице данные или нет, и соответственно разместить свою логику.

connectionObj.Tb_PurchaseProductDetail.Where(s => s.ProductId == prodcutId && ((s.Quantity + s.DiscountQuantity + (s.tb_productstockupdate.Any() ? s.tb_productstockupdate.Select(d => d.StockDifference).Sum() : 0)) > s.SoldPackQuantity)).Select(s => new SelectListItem()
            {
                Text = s.BatchNumber + " [(" + (s.Quantity + s.DiscountQuantity + (s.tb_productstockupdate.Any()? s.tb_productstockupdate.Sum(d => d.StockDifference) : 0) - s.SoldPackQuantity) + ") & " + s.ExpiryDate + "]",
                Value = s.Id.ToString()
            }).ToList();

Ответы [ 2 ]

0 голосов
/ 11 апреля 2019

Ниже код решил мою проблему. Я использовал Any () для проверки наличия данных во вторичной таблице и соответственно использовал троичный оператор.

connectionObj.Tb_PurchaseProductDetail.Where(s => s.ProductId == prodcutId && ((s.Quantity + s.DiscountQuantity + (s.tb_productstockupdate.Any() ? s.tb_productstockupdate.Select(d => d.StockDifference).Sum() : 0)) > s.SoldPackQuantity)).Select(s => new SelectListItem()
            {
                Text = s.BatchNumber + " [(" + (s.Quantity + s.DiscountQuantity + (s.tb_productstockupdate.Any()? s.tb_productstockupdate.Sum(d => d.StockDifference) : 0) - s.SoldPackQuantity) + ") & " + s.ExpiryDate + "]",
                Value = s.Id.ToString()
            }).ToList();
0 голосов
/ 10 апреля 2019

Итак, у вас есть 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!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...