将此左连接SQL转换为方法语法Linq
本文关键字:方法 语法 Linq 转换 SQL 连接 | 更新日期: 2023-09-27 18:14:35
我需要在Linq中使用方法/流畅语法的等效SQL语句。
SELECT u.[UserId], s.[UserId], d.[UserId]
FROM dbo.[Attachment] z
INNER JOIN dbo.[Activity] a ON z.[ActivityId] = a.[ActivityId]
INNER JOIN dbo.[Case] c ON a.[CaseId] = c.[CaseId]
INNER JOIN dbo.[CaseUser] x ON c.[CaseId] = x.[CaseId]
INNER JOIN dbo.[User] u ON x.[UserId] = u.[UserId]
LEFT OUTER JOIN dbo.[User] s ON u.[SupervisorId] = s.[UserId]
LEFT OUTER JOIN dbo.[User] d ON s.[SupervisorId] = d.[UserId]
WHERE u.[UserId] = @x OR s.[UserId] = @x OR d.[UserId] = @x
同样,我在必须返回System.Linq.Expressions.Expression对象的上下文中使用它。例如,现有的更简单的代码示例是:
public override Expression<Func<Attachment, bool>> MatchingCriteria
{
get { return a => a.Activity.Case.CaseUsers.Any(x => (x.User.Id == this.id)); }
}
我被使用计算结果为bool的方法语法的左连接难住了。
我认为以下应该可以工作…您检查以确保模型中的相关实体不为空,然后如果不是,则进行比较:
return a => a.Activity.Case.CaseUsers
.Where(cu => cu.User.Id == this.id ||
(cu.User.Supervisor != null &&
cu.User.Supervisor.Id == this.Id) ||
(cu.User.Supervisor != null &&
cu.User.Supervisor.Supervisor != null &&
cu.User.Supervisor.Supervisor.Id == this.Id));
使用下面的方法,您可以检查所需的Id是否存在并选择项目。
使用如下样例类定义:
class Foo
{
public int FirstBarId { get; set; }
public int SecondBarId { get; set; }
}
class Bar
{
public int BarId { get; set; }
}
可以这样查询:
var query = fooSet.Select(foo => new
{
Foo = foo,
Bar1 = barSet.FirstOrDefault(bar => foo.FirstBarId == bar.BarId),
Bar2 = barSet.FirstOrDefault(bar => foo.SecondBarId == bar.BarId)
})
.Where(x => x.Bar1 != null || x.Bar2 != null);