簡體   English   中英

我如何加入OR條件?

[英]How do I join with OR condition?

這是我的LINQ代碼:

from b in dbContext.SAPBillOfMaterials 
from t in dbContext.AUXComponentTypes
where t.ParentId == b.Parent.Id && 
t.MaterialType == b.Component.MaterialType && 
(t.ComponentCategoryCode == null || t.ComponentCategoryCode == b.Component.ComponentCategoryCode)
    select new
    {
      ComponentCode = b.Component.Model_ComponentCode,
      Grid = b.Component.Grid ,
      ComponentType = t.ComponentType,
      ConfigurationId = configId,
      ParentSKUId = b.Parent.Id ,
      SKUId = b.Component.Id 
     };

這是LINQ to Entities翻譯:

    SELECT 
    [Extent2].[ParentId] AS [ParentId], 
    [Extent4].[Model_ComponentCode] AS [Model_ComponentCode], 
    [Extent4].[Grid] AS [Grid], 
    [Extent2].[ComponentType] AS [ComponentType], 
    [Extent1].[Parent_Id] AS [Parent_Id], 
    [Extent1].[Component_Id] AS [Component_Id]
    FROM    [dbo].[SAPBillOfMaterial] AS [Extent1]
    INNER JOIN [dbo].[AUXComponentTypes] AS [Extent2] ON [Extent1].[Parent_Id] = [Extent2].[ParentId]
    INNER JOIN [dbo].[SAPMasterMaterialSKU] AS [Extent3] ON ([Extent2].[MaterialType] = [Extent3].[MaterialType]) 
AND ([Extent1].[Component_Id] = [Extent3].[Id]) 
**AND ([Extent2].[ComponentCategoryCode] = [Extent3].[ComponentCategoryCode])**
    LEFT OUTER JOIN [dbo].[SAPMasterMaterialSKU] AS [Extent4] ON [Extent1].[Component_Id] = [Extent4].[Id]

所以,它完全忽略了連接中的OR條件:

(t.ComponentCategoryCode == null || t.ComponentCategoryCode == b.Component.ComponentCategoryCode)

有人能告訴我為什么或我做錯了什么?

更新這里是我的模型的簡化版本:

public class AUXComponentType
{
    [Key]
    public int Id { get; set; }

    [Required, ForeignKey("SAPMasterMaterialSKU")]
    public int ParentId { get; set; }

    public virtual SAPMasterMaterialSKU SAPMasterMaterialSKU { get; set; }

    [Required,StringLength(4)]
    public string MaterialType { get; set; }

    [Required, StringLength(1)]
    public string ComponentType { get; set; }

    [Required, StringLength(20)]
    public string ComponentCategoryCode { get; set; }

}

public class SAPBillOfMaterial
{
    [Key, Column(Order = 1)]
    public int Id { get; set; }

    [InverseProperty("SAPBOMChilds"), Column(Order = 2)]
    public virtual SAPMasterMaterialSKU Parent { get; set; }

    [InverseProperty("SAPBOMs"), Column(Order = 3)]
    public virtual SAPMasterMaterialSKU Component { get; set; }

    public decimal Quantity { get; set; }

}

public class SAPMasterMaterialSKU
{
    [Key]
    public int Id { get; set; }

    [Required,MaxLength(18)]
    public string Model_ComponentCode { get; set; }

    [MaxLength(8)]
    public string Grid { get; set; }

    [Required,MaxLength(4)]
    public string MaterialType { get; set; }


    [Required, MaxLength(20)]
    public string ComponentCategoryCode { get; set; }

    public virtual ICollection<SAPBillOfMaterial> SAPBOMChilds { get; set; }
    public virtual ICollection<SAPBillOfMaterial> SAPBOMs { get; set; }
    public virtual ICollection<AUXComponentType> AUXComponentTypes { get; set; }

}

從SQL LINQ中獲取SQL是一個多步驟的過程,因此要確定轉換某些操作的位置並不總是很容易。 LINQ創建了一個與語言無關的表達式樹,它將傳遞給EF運行時。 EF然后創建一個“cannonical”查詢表達式樹。 這樣做的原因是EF可以在幕后使用許多不同的DB ADO提供者之一,所以在這一點上,它只是獲得了可以在數據庫上使用的通用表達式樹。 然后它將此“cannonical”查詢表達式傳遞給EF ADO Provider,后者又生成實際的SQL語句。

在其中一個傳遞期間,你的OR條件被“優化”了,我懷疑它與LINQ處理連接的方式有關。 在你的情況下,在LINQ語句中沒有實際的JOIN子句,我懷疑它默認是做一個內連接,技術上不能讓連接的一邊有NULL(連接的兩邊必須在內連接中匹配)。

你真正想要的是OUTER JOIN,其中一方允許有NULL。 如果您在Internet上查詢LINQ和OUTER JOIN,您將獲得一些如何創建LINQ語句的示例,以允許其中一個邊包含NULL。

是否有可能擁有AUXComponentTypes.ComponentCategoryCode == null? 該字段是否標記為不可為空?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM