繁体   English   中英

编写Linq-to-Entities查询

[英]writing Linq-to-Entities query

我是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
......

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

我正在尝试查找SCMSHPMAST.DELIVERYDATE不为null的所有skus(SCMSKUFILEs)。 正如我定义的外键一样,生成的模型会自动将SCMSHIPPINGDETAIL和与之关联的每个SCMSKUFILE(以及附加到每个SCMSHIPPINGDETAIL的SCMSHPMAST)带入。 我可以对所有单个文件进行联接以获得所需的结果,但是我想为此使用LINQ和由实体框架生成的模型。

我正在尝试执行以下操作:-选择SCMSHIPPINGDETAILs具有SCMSHPMAST且DELIVERYDATE不等于null的所有SCMSKUFILEs。

使用单个LINQ查询可以完成此操作吗? 我已经花了很多力气,但无法编写LINQ查询。

我希望我已经正确解释了我的问题。 请让我知道我是否错过了什么?

谢谢阿比

你尝试过这样的事情吗?

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”和“ All”来表示此类查询,例如:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM