Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server On子句中具有多个条件的LINQ连接查询_Sql Server_Sql Server 2008 - Fatal编程技术网

Sql server On子句中具有多个条件的LINQ连接查询

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

如何在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描述订购
按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
    });
告诉我您的类是否与此不同,或者您是否需要更多详细信息,或者执行此查询的其他方式