猿问

使用嵌套 SQL 的视图模型中的 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 个类的视图模型:


查看型号:


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; }


}


桃花长相依
浏览 179回答 3
3回答

牛魔王的故事

以下将起作用from sweet in db.Sweetsjoin cart in db.Carts&nbsp;on sweet.SweetID equals cart.SweetID into swctfrom sc in swct.DefaultIfEmpty()select new { Sweet = sweet, Qty = sweet.Key == sc.Key ? sc.Qty : 0 }

哈士奇WWW

您应该使用 LINQ 连接函数。对于我的示例,我还使用了您的 SQL 查询的更改版本,我认为它是相同的:SELECT sweets.*, carts.QtyFROM sweets LEFT JOIN carts ON sweets.SweetID = carts.SweetIDWHERE carts.CartID = '7125794e-38f4-4ec3-b016-cd8393346669'然后我使用 JOIN 函数将这个新查询转换为 LINQ。var cartId = '7125794e-38f4-4ec3-b016-cd8393346669'var query = db.Sweets&nbsp; &nbsp; // table in the "from" statement&nbsp; &nbsp;.GroupJoin(db.Carts, // all carts for that sweet will be joined into [sweets -> Cart[]]&nbsp; &nbsp; &nbsp; cart => cart.SweetID,&nbsp; &nbsp; &nbsp; &nbsp; // the first part of the "on" clause in an sql "join" statement&nbsp; &nbsp; &nbsp; sweet => sweet.SweetID,&nbsp; &nbsp;// the second part of the "on" clause)&nbsp; &nbsp; &nbsp; (sweet, carts) => new { Sweet = sweet, Carts = cart }) // create new compound object&nbsp; &nbsp;.SelectMany(&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sweetsCarts => sweetsCart.Carts.DefaultIfEmpty(), //show the sweet even if there is no cart&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (x,y) => new { Sweet = x.Sweet, Cart = y });&nbsp; &nbsp;.Where(sweetsCart => sweetsCart.Cart.CartID == cartId);&nbsp; &nbsp; // restrict your cartID基本上,该Join函数生成一个复合对象列表,其中包含一个Sweet对象和一个Cart带有每个列表条目的对象,因此您可以访问sweetsCart.Cart.CartID或sweetsCart.Sweets.SweetID。=>顺便说一下,左侧的名称可以是您想要的任何名称,它只是 LINQ 的标识符。我选择称它为“sweetsCart”。带有 SelectMany 的 GroupJoin 可以进行左连接。
随时随地看视频慕课网APP
我要回答