使用嵌套SQL的视图模型中的LINQ数据

时间:2018-07-16 12:00:16

标签: c# entity-framework linq

我可以使用以下TSQL访问数据:

select Sweets.*, Qty
from Sweets
left join (select SweetID,  Qty from carts where CartID = '7125794e-38f4-4ec3-b016-cd8393346669' ) t 
  on Sweets.SweetID = t.SweetID

但是我不确定如何在Web应用程序上获得相同的结果。有谁知道使用LINQ如何做到这一点?

到目前为止,我有:

 var viewModel = new SweetViewModel
 {

   Sweet = db.Sweets.Where(s => db.Carts.Any(c => c.SweetID == s.SweetID))

 };

编辑:对不起,我应该指定我使用的是2类的View模型:

查看模型:

public class SweetViewModel
{

    public IEnumerable<Sweet> Sweet { get; set; }
    public IEnumerable<Cart> Cart { get; set; }

    //public Cart OrderQty { get; set; }

}

public class Sweet
{
    public int SweetID { get; set; }

    public int CategoryID { get; set; }
    public Category Category { get; set; }
    public string SweetName { get; set; }
    public bool Singular { get; set; }
    public string Description { get; set; }
    public decimal Price { get; set; }


    public virtual ICollection<Cart> Carts { get; set; }
}

public class Cart
{
    [Key]
    public int RecordID { get; set; }
    public string CartID { get; set; }
    public int SweetID { get; set; }
    public int PemixID { get; set; }
    public int Qty { get; set; }
    public System.DateTime DateCreated { get; set; }

    public Sweet Sweet { get; set; }
    public PreMix PreMix { get; set; }

}

3 个答案:

答案 0 :(得分:0)

var res=(from sweet in db.Sweets
         join cart in db.Carts.Select(x=>new{x.SweetID,x.Qty})
         on sweet.SweetID equals cart.SweetID
         into r11
         from r1 in r11.DefaultIfEmpty()
         select new {sweet,r1})
         .Select(x=>new 
                    {
                     Sweet=x.sweet,
                     Qty=x.r1?.Qty
                    }) 
         .ToList();

这将为您提供与sql查询相同的结果。

res将是List<a>,其中a是匿名类,其结构将是  {Sweet,Qty}

答案 1 :(得分:0)

以下将起作用

from sweet in db.Sweets
join cart in db.Carts 
on sweet.SweetID equals cart.SweetID into swct
from sc in swct.DefaultIfEmpty()
select new { Sweet = sweet, Qty = sweet.Key == sc.Key ? sc.Qty : 0 }

答案 2 :(得分:-1)

您应该使用LINQ连接功能。

在我的示例中,我还使用了您认为相同的SQL查询版本:

SELECT sweets.*, carts.Qty
FROM sweets LEFT JOIN carts ON sweets.SweetID = carts.SweetID
WHERE carts.CartID = '7125794e-38f4-4ec3-b016-cd8393346669'

然后我使用JOIN函数将此新查询翻译为LINQ。

var cartId = '7125794e-38f4-4ec3-b016-cd8393346669'
var query = db.Sweets    // table in the "from" statement
   .GroupJoin(db.Carts, // all carts for that sweet will be joined into [sweets -> Cart[]]
      cart => cart.SweetID,        // the first part of the "on" clause in an sql "join" statement
      sweet => sweet.SweetID,   // the second part of the "on" clause)
      (sweet, carts) => new { Sweet = sweet, Carts = cart }) // create new compound object
   .SelectMany(
              sweetsCarts => sweetsCart.Carts.DefaultIfEmpty(), //show the sweet even if there is no cart
              (x,y) => new { Sweet = x.Sweet, Cart = y });
   .Where(sweetsCart => sweetsCart.Cart.CartID == cartId);    // restrict your cartID

基本上,Join函数创建一个复合对象列表,其中每个列表条目都包含一个Sweet对象和一个Cart对象,因此为什么可以访问sweetsCart.Cart.CartIDsweetsCart.Sweets.SweetID

=>左侧的名称可以是您想要的任何名称,它只是LINQ的标识符。我选择将其命名为“ sweetsCart”。

使用SelectMany的GroupJoin可以进行左联接。