为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
桃花长相依 2021-10-09 16:31:14
我可以使用以下 TSQL 访问数据:select Sweets.*, Qtyfrom Sweetsleft 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; }}
查看完整描述

3 回答

?
牛魔王的故事

TA贡献1830条经验 获得超3个赞

以下将起作用


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 }


查看完整回答
反对 回复 2021-10-09
?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

您应该使用 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.CartID或sweetsCart.Sweets.SweetID。


=>顺便说一下,左侧的名称可以是您想要的任何名称,它只是 LINQ 的标识符。我选择称它为“sweetsCart”。


带有 SelectMany 的 GroupJoin 可以进行左连接。


查看完整回答
反对 回复 2021-10-09
  • 3 回答
  • 0 关注
  • 178 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信