簡體   English   中英

計算 2 個表 where 條件 - Linq

[英]Calculate 2 table where condition - Linq

我有 2 張桌子,

產品表

id  produk  batch   qty
1   AAA    ADADAD   2
2   BBB    ADADAD   2
3   BBB    AAAAAA   2
...............

並移動桌子,

id  produk  batch   qty
1   BBB     ADADAD  1

我想在 stok 表中的數量減去移動表中的數量后顯示表,我想要什么表

PRODUK  BATCH   QTY
AAA     ADADAD  2
BBB     ADADAD  1
BBB     AAAAAA  2

這是我的查詢

var obj = _db.produk
       .Groupby(a=> new {a.code,a.batch})
       .Select(a=> new {
          produk = a.key.code,
          batch = a.Key.batch,
          qty = _db.move.Where(c => a.Any(p => p.code == a.code && p.batch == a.batch)).Sum(a=>a.qty)
       }).tolist();

但不工作

您必須對分組移動表執行 LEFT JOIN。

var moves =
  from m in _db.move
  group m by { m.code, m.batch } into g
  select
  {
      g.Key.code,
      g.Key.batch,
      qty = g.Sum(x => x.qty)
  };

var query = 
   from p in _db.produk
   join m in moves on new { p.code, p.batch } equals { m.code, m.batch } into j
   from m in j.DefaultIfEmpty()
   select new
   {
       produk = p.code,
       batch = p.batch.
       qty = p.qty - (int?)m.qty ?? 0
   };

如果您更喜歡方法語法而不是查詢語法,那么您可以將查詢編寫為:

var availableItems = repository
    .GroupJoin(purchases,
        stock => new { stock.Product, stock.Batch }, 
        move => new { move.Product, move.Batch },
        (stock, moves) => new { Stock = stock, Moves = moves })
    .SelectMany(
        stockAndRelatedMoves => stockAndRelatedMoves.Moves.DefaultIfEmpty(), 
        (stockAndRelatedMoves, relatedMove) => new
        {
            stockAndRelatedMoves.Stock.Product,
            stockAndRelatedMoves.Stock.Batch,
            Quantity = stockAndRelatedMoves.Stock.Quantity - (relatedMove?.Quantity ?? 0)
        })
    .ToList();

正如你所看到的,而不是GroupBy你需要使用GroupJoin和,而不是簡單的Select你需要SelectMany檢索來自聯接的記錄項目。

一些解釋:

  • stock => new { stock.Product, stock.Batch } :這里使用匿名類型,因為在stock => new { stock.Product, stock.Batch }中使用了多個字段
  • stockAndRelatedMoves => stockAndRelatedMoves.Moves.DefaultIfEmpty() :由於左外連接需要它
  • (relatedMove?.Quantity ?? 0) : relatedMove可以為null這就是為什么我們用 0 替換它

在上面的代碼中,我使用了以下集合:

var repository = new List<Stock>
{
    new Stock { Id = 1, Product = "AAA", Batch = "ADADAD", Quantity = 2 },
    new Stock { Id = 2, Product = "BBB", Batch = "ADADAD", Quantity = 2 },
    new Stock { Id = 3, Product = "BBB", Batch = "AAAAAA", Quantity = 2 },
};

var purchases = new List<Move>
{
    new Move { Id = 1, Product = "BBB", Batch = "ADADAD", Quantity = 1 }
};

您還可以查詢produck表,然后在 Select 語句中,根據 produck 的batchproduck屬性過濾move表,然后計算qty

代碼如下:

        List<Produk> produks = new List<Produk>()
        {
            new Produk(){ id = 1, produk= "AAA", batch="ADADAD", qty = 2},
            new Produk(){ id = 2, produk= "BBB", batch="ADADAD", qty = 2},
            new Produk(){ id = 3, produk= "BBB", batch="AAAAAA", qty = 2},
        };

        List<Remove> removes = new List<Remove>()
        {
            new Remove(){ id=1, produk="BBB", batch="ADADAD", qty=1}
        };

        var result = (from p in produks
                      select new Produk
                      {
                          id = p.id,
                          produk = p.produk,
                          batch = p.batch,
                          qty = p.qty - removes.Where(c => c.produk == p.produk && c.batch == p.batch).Sum(c => c.qty)
                      }).ToList();

結果是這樣的:

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM