如何在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
答案 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
});
告诉我你的课程是不是这样,或者你是否需要更多细节或其他方式来执行这个查询。