Sql server On子句中具有多个条件的LINQ连接查询
如何在linq查询中为以下sql查询条件“和(2,4)中的CO.ApprovalStatusID”编写关于equal子句的条件 从i8control.CostItem CI中选择CI.CostItemId、CI.ParentId、CI.CBSPosition、CO.ApprovalStatusID 左连接CI上的i8control.ChangeOrderDetail CD.CostItemId=CD.CostItemId 左键连接CD上的i8control.ChangeOrder Co。ChangeOrderId=Co.ChangeOrderId和Co.ApprovalStatusID(2,4) 其中CI.ProjectID=3和CI.isActive=1——按CO.ApprovalStatusId描述订购Sql server On子句中具有多个条件的LINQ连接查询,sql-server,sql-server-2008,Sql Server,Sql Server 2008,如何在linq查询中为以下sql查询条件“和(2,4)中的CO.ApprovalStatusID”编写关于equal子句的条件 从i8control.CostItem CI中选择CI.CostItemId、CI.ParentId、CI.CBSPosition、CO.ApprovalStatusID 左连接CI上的i8control.ChangeOrderDetail CD.CostItemId=CD.CostItemId 左键连接CD上的i8control.ChangeOrder Co。Chan
按CI.CostItemId、CI.ParentId、CI.CBSPosition、CO.ApprovalStatusID分组根据您的选择,您可能会得到
CO.ApprovalStatusID
返回空值的行,因为您使用的是左联接
,并且在的where
中没有为其指定任何子句(因为您使用的是左
)
您的示例查询表明,您的目标不是仅获取CostItems
,其中它们的ChangeOrder
的ApprovalStatusID
等于2或4。您的查询将获得项目3的所有活动的CostItems
,并列出它们的CostItemId、ParentId、CBSPosition
,如果它们的ChangeOrder
的ApprovalStatusID
等于2或4,则将获得该状态(无论是2还是4)
在语句中生成有点简单。您可以创建一个包含所需状态(2和4)的int
数组,并按如下方式使用它:
var validStatus = new int[] { 2, 4 };
ctx.ChangeOrders.Where(co => validStatus.Any(vs => vs == co.ApprovalStatusID));
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
});
现在,我可以看到两种解决完整查询的方法,一种是使用linqgroupjoin
执行左连接,另一种是使用实体关系。我使用了最后一个假设这些类的例子:
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 };
ctx.ChangeOrders.Where(co => validStatus.Any(vs => vs == co.ApprovalStatusID));
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
});
告诉我您的类是否与此不同,或者您是否需要更多详细信息,或者执行此查询的其他方式