【发布时间】:2017-04-07 01:47:27
【问题描述】:
很抱歉,我在 LINQ 上有点薄弱,我总是在开始处理复杂的 LINQ 之前编写 SQL 查询。
我想问一下如何使用LEFT JOIN 和多个ON 条件使用OR 运算符 将此SQL 查询转换为LINQ。,
m.MerchandiseId 将在 ON 条件下使用两次
SELECT
*
FROM
Inbox AS i
INNER JOIN [User] AS u ON i.FromUserId = u.UserId
LEFT OUTER JOIN Merchandise AS m ON
u.MerchandiseId = m.MerchandiseId
OR
i.ToMerchantId = m.MerchandiseId
WHERE
i.ToCompanyId = 10
OR
i.FromCompanyId = 10
var message = (from i in db.Inbox
join u in db.User on i.FromUserId equals u.UserId
join m in db.Merchandise on u.MerchandiseId equals m.MerchandiseId //here I want to ON i.MerchantId = m.MerchandiseId, but it doesn't allow
where i.ToCompanyId == user.CompanyId || i.FromCompanyId == user.CompanyId
orderby i.CreatedAt descending
group m.MerchandiseId by new { m.MerchandiseId, m.MerchandiseName } into grp
select new
{
MerchandiseId = grp.Key.MerchandiseId,
MerchandiseName = grp.Key.MerchandiseName,
InboxMessage = (from e in db.Inbox
join us in db.User on e.FromUserId equals us.UserId
join mer in db.Merchandise on us.MerchandiseId equals mer.MerchandiseId
where mer.MerchandiseId == grp.Key.MerchandiseId
orderby e.CreatedAt descending
select e.InboxMessage).FirstOrDefault(),
CreatedAt = (from e in db.Inbox
join us in db.User on e.FromUserId equals us.UserId
join mer in db.Merchandise on us.MerchandiseId equals mer.MerchandiseId
where mer.MerchandiseId == grp.Key.MerchandiseId
orderby e.CreatedAt descending
select e.CreatedAt).FirstOrDefault(),
}).ToList();
我为它编写的底部 LINQ 查询。但是,我只能在 LINQ 中使用多个 ON 子句处理左连接。感谢有人会在这方面帮助我。谢谢!
【问题讨论】:
-
@Sherlock 这不是重复的,您链接到的 Linq 查询有多个
AND,而不是OR。 -
@Dai 我没有说它是重复的 santosh singh 不是我评论的 :) 不要让我心脏病发作,还有链接,让他弄清楚发生了什么,这样他就可以学习了,我们需要弄脏我们的手才能学习而不是用勺子喂食
-
@Sherlock 正确检查我的查询,它不会重复,因为我在 stackoverflow 中找不到很多解决方案,我只是将它发布到这里。
-
@jefferyleo 我没有说它是重复的 santosh singh 说过的(他的评论已经被删除)。我提供的链接可作为您从哪里开始的提示。
-
@Sherlock 顺便感谢一下,但我的情况与其他人有点不同,我的 ON 条件是 3 个不同的列
标签: c# sql sql-server linq