将此左连接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的方法语法的左连接难住了。

将此左连接SQL转换为方法语法Linq

我认为以下应该可以工作…您检查以确保模型中的相关实体不为空,然后如果不是,则进行比较:

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);