编写链接到实体查询

本文关键字:实体 查询 链接 | 更新日期: 2023-09-27 18:14:24

我是LINQ和实体框架的新手,我被困在一个我试图写的特定查询上。我有一个数据库与以下结构。为了简单起见,我只包含了与问题相关的文件和字段。

Table: SCMPOFILE
Columns: 
POKEY
PONUMBER
...

Table: SCMSKUFILE
SKUKEY
POKEY - Foreign Key on SCMPOFILE.POKEY
.....

Table: SCMSHPMAST
SHIPKEY
DELIVERYDATE
.....

Table: SCMSHIPPINGDETAIL
SHPDTLKEY
SHIPKEY  - Foreign Key on SCMSHPMAST.SHIPKEY
POKEY - Foreign Key on SCMPOFILE.POKEY
SKUKEY - Foreign Key on SCMSKUFILE.SKUKEY
......

从结构中可以看到,一个发货密钥可以有多个发货详细信息密钥类似地,每个PO和sku可以有多个与之关联的装运密钥。

我试图找到所有skus (SCMSKUFILEs),其中SCMSHPMAST。DELIVERYDATE不为空。由于我已经定义了外键,因此生成的模型自动将SCMSHIPPINGDETAILs与每个与之关联的SCMSKUFILE(以及附加到每个SCMSHIPPINGDETAIL的SCMSHPMAST)关联起来。我可以对所有单独的文件进行连接以获得我想要的结果,但我想使用LINQ和实体框架生成的模型。

我正在尝试做这样的事情:-选择所有SCMSKUFILEs,其中SCMSHIPPINGDETAILs的SCMSHPMAST的DELIVERYDATE不等于null。

这是可以使用单个LINQ查询完成的事情吗?我挠了挠头,但我不能写LINQ查询。

我希望我已经正确地解释了我的问题。如果我错过了什么,请告诉我。

谢谢,Abhi .

编写链接到实体查询

你试过这样的方法吗?

var results = SCMSKUFILEs.Where(a => a.SCMSHIPPINGDETAILs.Any(d => d.SHIPMASTs.Any(m => m.DELIVERYDATE != null)));

我不确定它是否值得使用嵌套的ANY,但值得一试。

你也可以从另一个方向,像这样…

var results = SHIPMASTs.Where(m => m.DELIVERYDATE != null)
    .SelectMany(m => m.SCMSHIPPINGDETAILs)
    .SelectMany(d => d.SCMSKUFILEs)
    .Distinct();

不需要太深入地研究表的结构,您似乎正在寻找一个查询,该查询基于父结果的一些子结果的属性(DELIVERYDATE不等于null)来限制父结果(SCMSKUFILE)。LINQ使用量词"Any"answers"All"来表达这样的查询,例如:

edm.Parents.Where(p => p.Children.Any(c => c.DeliveryDate != null));

这可能无法转化为您想要的确切SQL查询,但它应该可以工作。