编写链接到实体查询
本文关键字:实体 查询 链接 | 更新日期: 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查询,但它应该可以工作。