使用嵌套 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.IEnumerablesweet
对象列表,而是返回具有sweet
和qty
属性的新对象列表【参考方案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<a>
其中a
是匿名类,它的结构将是
Sweet,Qty
.
【讨论】:
投反对票的那个..你能说说为什么吗? 不是我拒绝投票,但这个解决方案对我没有用,它显示错误 SweetID 在当前上下文中不存在,购物车同样的错误 你能发布你的课程Sweet
和Cart
我的错,我修改了方法,错过了一段代码。 @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.CartID
或 sweetsCart.Sweets.SweetID
。
=>
左侧的名称可以是任何您想要的名称,它只是 LINQ 的标识符。我选择称它为“sweetsCart”。
带有 SelectMany 的 GroupJoin 可以进行左连接。
【讨论】:
您已将其更改为的查询与我想要的数据结果不同。我基本上想显示每个糖果下购物车中存在的物品数量。因此,该特定购物车中甚至可能不存在该糖果,但我仍然需要显示该糖果。希望这是有道理的。 我错过了左连接。这样,它应该给出相同的结果,对吧?我还更新了 LINQ 查询。做左连接不是那么容易,但它是可能的。代码未经测试,但我建议您尝试一下。 不,这是退回购物车中存在的糖果。我需要左连接到嵌套查询,以便首先获取始终显示的糖果列表,然后添加数量(如果存在)。以上是关于使用嵌套 SQL 的视图模型中的 LINQ 数据 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
在 ASP.Net MVC (LINQ) 中将嵌套数据从控制器传递到视图
帮助我使用实体框架从 SQL 转换为 linq 嵌套 lambda 表达式
BigQuery SQL:将视图 A 中的子查询作为嵌套表嵌入视图 B