gpt4 book ai didi

c# - 我如何加入 OR 条件?

转载 作者:行者123 更新时间:2023-11-30 12:10:59 25 4
gpt4 key购买 nike

这是我的 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; }

}

最佳答案

从 EF LINQ 中获取 SQL 是一个多步骤过程,因此并不总是很容易看出某些操作在何处被转换。 LINQ 创建一个与语言无关的表达式树,它被传递到 EF 运行时。 EF 然后创建一个“规范的”查询表达式树。这样做的原因是 EF 可以在场景下使用许多不同的 DB ADO 提供程序中的一个,所以此时,它只是获得一个可以在数据库上使用的通用表达式树。然后它将这个“规范的”查询表达式传递给 EF ADO 提供程序,后者又生成实际的 SQL 语句。

在这些过程中,您的 OR 条件被“优化”掉了,我怀疑这与 LINQ 处理连接的方式有关。在您的情况下,如果 LINQ 语句中没有实际的 JOIN 子句,我怀疑它默认情况下是在执行内部联接,从技术上讲,它不能使联接的一侧具有 NULL(联接的两侧必须在内部联接中匹配)。

您真正想要的是 OUTER JOIN,其中一侧允许有 NULL。如果您在 Internet 上查询 LINQ 和 OUTER JOIN,您将获得一些示例,说明如何创建 LINQ 语句以允许其中一侧包含 NULL。

关于c# - 我如何加入 OR 条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16676992/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com