使用嵌套 SQL 的视图模型中的 LINQ 数据 [重复]

Posted

技术标签:

【中文标题】使用嵌套 SQL 的视图模型中的 LINQ 数据 [重复]【英文标题】:LINQ data from view model using nested SQL [duplicate] 【发布时间】:2018-07-16 12:00:16 【问题描述】:

我可以使用以下 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; 


【问题讨论】:

虽然不是Servy.... 【参考方案1】:

以下将起作用

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 

【讨论】:

错误 CS0266 无法将类型“System.Linq.IQueryable>”隐式转换为“System.Collections.Generic.IEnumerable'。存在显式转换(您是否缺少演员表?) 此查询不会返回sweet 对象列表,而是返回具有sweetqty 属性的新对象列表【参考方案2】:
var res=(from sweet in db.Sweets
         join cart in db.Carts.Select(x=>newx.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&lt;a&gt; 其中a 是匿名类,它的结构将是 Sweet,Qty.

【讨论】:

投反对票的那个..你能说说为什么吗? 不是我拒绝投票,但这个解决方案对我没有用,它显示错误 SweetID 在当前上下文中不存在,购物车同样的错误 你能发布你的课程SweetCart 我的错,我修改了方法,错过了一段代码。 @DarrenB 仍在抱怨数量不在上下文中。我正在使用 var viewModel = new SweetViewModel sweet = your solutin 【参考方案3】:

您应该使用 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

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

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

【讨论】:

您已将其更改为的查询与我想要的数据结果不同。我基本上想显示每个糖果下购物车中存在的物品数量。因此,该特定购物车中甚至可能不存在该糖果,但我仍然需要显示该糖果。希望这是有道理的。 我错过了左连接。这样,它应该给出相同的结果,对吧?我还更新了 LINQ 查询。做左连接不是那么容易,但它是可能的。代码未经测试,但我建议您尝试一下。 不,这是退回购物车中存在的糖果。我需要左连接到嵌套查询,以便首先获取始终显示的糖果列表,然后添加数量(如果存在)。

以上是关于使用嵌套 SQL 的视图模型中的 LINQ 数据 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 ASP.Net MVC (LINQ) 中将嵌套数据从控制器传递到视图

帮助我使用实体框架从 SQL 转换为 linq 嵌套 lambda 表达式

LINQ to SQL模型 是啥意思

BigQuery SQL:将视图 A 中的子查询作为嵌套表嵌入视图 B

使用 LINQ 根据 C# 中的属性值搜索嵌套在另一个列表中的列表中的项目?

使用视图控制器淘汰嵌套的可观察对象