簡體   English   中英

為什么不能從LINQ子查詢聯接中選擇數據?

[英]Why can't I select data from my LINQ sub query join?

我試圖使用左連接嵌套查詢從2個表中獲取數據。 這使我可以從項目表中獲取數據,但不能從購物車(嵌套查詢)表中獲取數據:

 var q = from s in db.Items
                    join sub in (from c in db.Carts
                                 where c.CartID == 1
                                 group c by c.ItemID into g
                                 select new
                                 {
                                     ItemID = g.Key,
                                     Qty = g.Select(s => s.Qty)

                                 }) on s.ItemID equals sub.ItemID into a
                    select new ItemViewModel
                    {
                        CategoryID = s.CategoryID,
                        Description = s.Description,
                        Price = s.Price,

    **This being the issue------>>>>>>>** //Qty = a.Select(j => j.Qty),

                        ItemID = s.ItemID,
                        ItemName = s.ItemName
                    };


                    viewModel = q.ToList();

我試圖實現的查詢是:

select Items.*, Cart.Qty
from Items
left join (select ItemID, Qty from carts where CartID = 1 ) Cart 
on Items.ItemID = Cart.ItemID

如果我理解正確,並假定ItemViewModel.Qty屬性只是一個int ,則所需查詢的最簡單形式為:

var q = from item in items
        join cart in
          (from cart in carts where cart.CartID == 1 select cart)
          on item.ItemID equals cart.ItemID into itemCarts
        select new ItemViewModel
        {
            ItemID = item.ItemID,
            Qty = itemCarts.Sum(cart => cart.Qty)
        };

如果你只想稍微修改/修復您的查詢:

var q = from s in db.Items
        join sub in (from c in db.Carts
                     where c.CartID == 1
                     group c by c.ItemID into g
                     select new
                     {
                         ItemID = g.Key,
                         Qty = g.Sum(s => s.Qty)
                         // or Qty = g.Select(s => s.Qty)
                         // and below: Qty = a.SelectMany(x => x.Qty).Sum()
                     })
            on s.ItemID equals sub.ItemID into a
        select new ItemViewModel
        {
            CategoryID = s.CategoryID,
            Description = s.Description,
            Price = s.Price,
            Qty = a.Sum(x => x.Qty),
            ItemID = s.ItemID,
            ItemName = s.ItemName
        };

您可以將GroupJoinSelectMany用於LEFT JOIN SQL查詢並獲取所需的輸出。

    var result = db.Items.GroupJoin(db.Carts.Where(x => x.CartID == 1), item => item.ItemID, cart => cart.ItemID, 
                 (item, cart) => new { item, cart })
                .SelectMany(x => x.cart.DefaultIfEmpty(), (it, ca) =>
                {
                    return new ItemViewModel
                {
                        ItemName = it.item.ItemName,
                        Price = it.item.Price,
                        ItemID = it.item.ItemID,
                        // ... .... .... 
                        // Fill the required columns from it.Item property..
                        Qty = ca != null ? ca.Qty : 0
                    };
                }).ToList();

編輯:具有SelectManyLINQ版本。

var result = from s in db.Items
        join sub in (from c in db.Carts
                     where c.CartID == 1
                     select c)
        on s.ItemID equals sub.ItemID into joined
        from row in joined.DefaultIfEmpty()
        select new ItemViewModel 
        { 
            CategoryID = s.CategoryID,
            Description = s.Description,
            Price = s.Price,
            Qty = row != null ? row.Qty : 0,
            ItemID = s.ItemID,
            ItemName = s.ItemName
        };

C#小提琴與示例數據。

暫無
暫無

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

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