我是LINQ和Entity Framework的新手,而且我一直困在我想写的特定查询上。 我有一个具有以下结构的数据库。为了简单起见,我刚刚提供了与问题相关的文件和字段。
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
......
从结构中可以看出,1个货件钥匙可以有多个货件明细钥匙 同样,每个PO和sku都可以有多个与之关联的货件密钥。
我正在尝试查找SCMSHPMAST.DELIVERYDATE不为空的所有skus(SCMSKUFILE)。由于我已经定义了外键,因此生成的模型会自动为SCMSHIPPINGDETAILs提供与之关联的每个SCMSKUFILE(以及连接到每个SCMSHIPPINGDETAIL的SCMSHPMAST)。我可以对所有单个文件进行连接以获得我想要的结果,但我想使用LINQ和实体框架生成的模型。
我正在尝试这样做: - 选择所有SCMSKUFILE,其中SCMSHIPPINGDETAILs的SCMSHPMAST的DELIVERYDATE不等于null。
这是可以使用单个LINQ查询完成的吗?我已经摸不着头脑,但我无法编写LINQ查询。
我希望我已正确解释了我的问题。如果我遗漏了什么,请告诉我?
谢谢, ABHI。
答案 0 :(得分:0)
你尝试过这样的事吗?
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();
答案 1 :(得分:0)
如果不深入研究表的结构,看起来您正在寻找一个基于某些子项的属性(DELIVERYDATE不等于null)来限制父结果(SCMSKUFILE)的查询。 LINQ使用量词“Any”和“All”来表达此类查询,例如:
edm.Parents.Where(p => p.Children.Any(c => c.DeliveryDate != null));
这可能无法转换为您想到的确切SQL查询,但它应该有效。