LINQ使用On子句中的多个条件加入查询

时间:2017-01-09 10:15:35

标签: sql-server sql-server-2008

如何在linq中写入相等子句的条件查询以下sql查询条件"和CO.ApprovalStatusID IN(2,4)"

从i8control.CostItem CI中选择CI.CostItemId,CI.ParentId,CI.CBSPosition,CO.ApprovalStatusID  左连接CI.CostItemId = CD.CostItemId上的i8control.ChangeOrderDetail CD 在CD.ChangeOrderId = Co.ChangeOrderId和CO.ApprovalStatusID IN(2,4)上左加入i8control.ChangeOrder Co 其中CI.ProjectID = 3,CI.isActive = 1 - 订购CO.ApprovalStatusId desc group by CI.CostItemId,CI.ParentId,CI.CBSPosition,CO.ApprovalStatusID

1 个答案:

答案 0 :(得分:1)

根据您的选择,您可能会获得CO.ApprovalStatusID返回NULL的行,因为您正在使用LEFT JOIN并且您没有在WHERE中为其指定任何子句(imho因为你正在使用LEFT)会很奇怪。

您的示例查询指出,您的目标不是仅CostItems ChangeOrder ApprovalStatusID等于2或4。{查询将获得所有有效CostItems项目3,并列出他们的CostItemId, ParentId, CBSPosition,如果他们的ChangeOrder ApprovalStatusID等于2或4,则会获得该状态(无论是2还是4)。

生成IN语句有点简单。您可以创建一个包含所需状态的array of int(2和4),并按照以下方式使用它:

var validStatus = new int[] { 2, 4 };
ctx.ChangeOrders.Where(co => validStatus.Any(vs => vs == co.ApprovalStatusID));

现在,我可以看到两种解析完整查询的方法,一种是使用LINQ GroupJoin执行LEFT JOIN,另一种是使用实体关系。我使用最后一个假设这些类为例:

public class CostItem
{
    public int CostItemId { get; set; }
    public int ParentId { get; set; }
    public int CBSPosition { get; set; }
    public int ProjectID { get; set; }
    public bool isActive { get; set; }
    public virtual ChangeOrderDetail Detail { get; set; } // Idk if this is a collection or one single optional child....
}

public class ChangeOrderDetail
{
    public int CostItemId { get; set; }
    public int ChangeOrderId { get; set; }
    public virtual ChangeOrder ChangeOrder { get; set; }
}

public class ChangeOrder
{
    public int ChangeOrderId { get; set; }
    public int ApprovalStatusID { get; set; }
}

public class CostItemWithChangeOrderApprovalStatus
{
    public int CostItemId { get; set; }

    public int ParentId { get; set; }

    public int CBSPosition { get; set; }

    public int? ApprovalStatusID { get; set; }
}

既然你要求LINQ并且没有提到任何特定的提供者(可能是EF6,ADO.NET ......),我提供了哪一个LINQ语句(适用于EF6,适用于例子)可能是这样的:

var validStatus = new int[] { 2, 4 };

this.CostItems
    .Where(ci => ci.ProjectID == 3 && ci.isActive)
    .Select(ci => new CostItemWithChangeOrderApprovalStatus
    {
        CostItemId = ci.CostItemId,
        ParentId = ci.ParentId,
        CBSPosition = ci.CBSPosition,
        ApprovalStatusID = validStatus.Contains(ci.Detail.ChangeOrder.ApprovalStatusID) ? (int?)ci.Detail.ChangeOrder.ApprovalStatusID : null
    });

告诉我你的课程是不是这样,或者你是否需要更多细节或其他方式来执行这个查询。