当前位置: 首页 > 编程语言 > C#

复杂的LINQ“任何”查询共享

时间:2023-04-11 12:02:37 C#

复杂的LINQ“任何”查询InvoiceID,PartID,Quantity,IsClaimed)我正在尝试从Invoices_Parts表中获取具有许多条件的InvoiceIDs列表。我遇到的问题是“Invoices_Parts中的任何部分都处于活动状态”。到目前为止的代码:IQueryablepartIds=db.Parts.Where(x=>x.OrganisationID==loggedInUser.OrganisationID).Select(y=>y.PartID);//&&x.IsActiveListinvoiceIds=db.Invoices_Parts.Where(x=>!x.IsClaimed&&x.Invoice.IsPaid&&partIds.Contains(x.PartID).DistinctBy(y=>y.InvoiceID).Select(z=>z.InvoiceID.ToString()).ToList();我已经注释掉“&&x.IsActive”,因为我希望InvoiceID列表的至少一部分必须满足IsActive条件-我不想过滤掉IsActive为假的所有部分。我如何在LINQ中实现这一点而无需手动循环遍历集合并添加/删除项目?注意:如果有人想知道,我正在为DistinctBy使用以下辅助方法:publicstaticIEnumerableDistinctBy(thisIEnumerablesource,FunckeySelector){foreach(源中的TSource元素){if(seenKeys.Add(keySelector(element))){yieldreturnelement;}}}编辑:我在每个实体上都有以下属性:Invoice:publicvirtualICollectionInvoices_Parts{get;放;}部分:公共虚拟ICollectionInvoices_Parts{get;放;}Invoices_Parts:publicvirtualInvoiceInvoice{get;放;}publicvirtualPartPart{get;放;人们经常将LINQ查询过度复杂化,因为他们习惯于从SQL表、连接等方面思考。通常,如果您将实际需求用简单的英语表达出来,您可以提出一个几乎相同的更简单的查询。我想要一张付费发票的发票ID列表,其中该发票上的任何部分都是有效的,等等。这个怎么样:从db.Invoices中的invoicewhereinvoice.IsPaidwhereinvoice.Invoices_Parts.Any(ip=>!ip.IsClaimed&&ip.Part.IsActive&&ip.OrganisationID==loggedInUser.OrganisationID)选择invoice.InvoiceId或者如果您更喜欢方法语法:db.Invoices.Where(i=>i.IsPaid).Where(i=>i.Invoices_Parts.Any(ip=>!ip.IsClaimed&&ip.Part.IsActive&&ip.OrganisationID==loggedInUser.OrganisationID).Select(i=>i.InvoiceId).ToList();PS-如果需要,您可以执行.ToString(),但根据我的经验,保持ID强类型化是明智的。PPS-您可以创建一个完全匹配实体框架的DistinctBy方法(不强制过早评估),如下所示:=>i.FirstOrDefault());好吧,假设你想要所有至少有一部分ONTHATINVOICE活动的发票,我会这样做:.Select(y=>y.PartID);列出invoiceIds=db.Invoices_Parts.Where(x=>!x.IsClaimed&&x.Invoice.IsPaid&&partIds.Contains(x.PartID)).Select(y=>y.InvoiceID.ToString()).Distinct().ToList();如果它看起来很像您所拥有的,那是因为它确实如此。据我所知,你已经达到了99.99%。您可以在此处将发票与零件链接起来,为每张发票创建所有零件的集合。一旦你有了这个集合,就很容易确定其中的任何一项是否有效:以上就是C#学习教程:复杂LINQ“任何”查询分享的所有内容,如果它对任何人有用并且需要了解更多有关C#的信息我希望您多关注教程—ListinvoiceIds=(frominvoiceindb.Invoices_Partswhere!invoice.IsClaimed&&invoice.Invoice.IsPaidjoinpartinpartIdsoninvoice.PartIdequalspartintopartswhereparts.Any(part=>部分.IsActive)选择发票.InvoiceID).Distinct().ToList();本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:

最新推荐
猜你喜欢