目前,我已经写了这个:
public Task<List<BulkmailAnnouncementModel>> GetBulkmailAnnouncementsByPackageTrackingId(string packageTrackingIdentification)
{
var announcement = await Context.BulkmailAnnouncement
.Include(x => x.Tarras)
.Include(x => x.PackageTrackingIdentifications)
.Where(x => x.PackageTrackingIdentifications.Any(y => y.Value == packageTrackingIdentification) &&
x.AuditReportIndicator != true)
.FirstAsync();
return await Context.BulkmailAnnouncement
.Include(x => x.Tarras)
.Include(x => x.PackageTrackingIdentifications)
.Where(x => x.CustomerOrderId == announcement.CustomerOrderId && x.CustomerPartyAccountId == announcement.CustomerPartyAccountId)
.ToListAsync();
}
我试图将这2条语句合并为1条。我只想查询一次数据库,因为将第一个查询的结果加载到内存中,然后将其用于第二个查询效率很低。
我想要的结果是BulkmailAnnouncements
的列表,它们都具有相同的customerOrderId
和CustomerPartyId
。
为了找出哪个customerOrderId
和CustomerPartyId
,我首先需要找到1个bulkmailAnnouncement
,它的packageTrackingIdentification
等于方法的参数。然后使用该bulkmailAnnouncement
查找具有相同的customerOrderId
和CustomerPartyId
的所有其他公告。
答案 0 :(得分:1)
A,您没有用文字说明您的要求。因此,我必须查看您的代码以查看所需的内容。
显然,您有一个输入参数packageTrackingIdentification
和一个可查询的序列BulkmailAnnouncements
。
每个BulkmailAnnouncement
都有一个布尔值AuditReportIndicator
和零个或多个PackageTrackingIdentifications
。
您的第一个查询,获取第一个BulkmailAnnouncement
(具有真实的AuditReportIndicator
和至少一个等于输入参数PackageTrackingIdentification
的{{1}})(的几个属性)>
您的第二个查询获取所有packageTrackingIdentification
的(几个属性),它们的某些属性(CustomerOrderId和CustomerPartyAccountId)等于您从第一个查询中获取的属性。
您可以将所有BulkmailAnnouncements
分组为具有相同BulkmailAnnouncements
的组。因此,您知道一个组中的所有certain properties
的{{1}}值都相同
保持第一组中至少有一个BulkmailAnnouncement
为真certain properties
并且至少一个BulkmailAnnouncement
等于您的输入参数AuditReportIndicator
。
请注意,后面的部分等于您在第一个查询中选择的部分。结果是一组。您知道该组中的所有PackageTrackingIdentification
的{{1}}值都相同,并且其他组中没有packageTrackingIdentification
的{{1}}值相同。此外,您还知道该组还包含至少一个BulkMailAnnouncements
为真certain properties
和至少一个BulkMailAnnouncements
等于您的输入参数certain properties
的{{1}}。因此,您请求的结果等于您想要的项目。
BulkMailAnnouncement
答案 1 :(得分:0)
将Where
谓词移至第二个查询:
return await Context.BulkmailAnnouncement
.Include(x => x.Tarras)
.Include(x => x.PackageTrackingIdentifications)
.Where(x => x.PackageTrackingIdentifications != null
&& x.PackageTrackingIdentifications.Any(y => y.Value == packageTrackingIdentification)
&& x.AuditReportIndicator != true)
.ToListAsync();
或在第一个呼叫Include
:
var announcement = await Context.BulkmailAnnouncement
.Include(x => x.Tarras)
.Include(x => x.PackageTrackingIdentifications)
.Where(x => x.PackageTrackingIdentifications != null
&& x.PackageTrackingIdentifications.Any(y => y.Value == packageTrackingIdentification)
&& x.AuditReportIndicator != true)
.FirstAsync();
我想要的结果是BulkmailAnnouncements的列表,这些列表均具有相同的customerOrderId和CustomerPartyId。为了找出哪个customerOrderId和CustomerPartyId,我首先需要找到1个bulkmailAnnouncement,它的packageTrackingIdentification等于该方法的参数。然后使用该bulkmailAnnouncement查找具有相同customerOrderId和CustomerPartyId的所有其他公告。
然后通过CustomerOrderId
和CustomerPartyAccountId
属性对结果进行分组,并采用第一组,例如:
return (await Context.BulkmailAnnouncement
.Include(x => x.Tarras)
.Include(x => x.PackageTrackingIdentifications)
.Where(x => x.PackageTrackingIdentifications != null
&& x.PackageTrackingIdentifications.Any(y => y.Value == packageTrackingIdentification)
&& x.AuditReportIndicator != true)
.GroupBy(x => new { x.CustomerOrderId, x.CustomerPartyAccountId })
.FirstAsync()).ToArray();
答案 2 :(得分:0)
其他方法是使用如下所示的Concat()方法
var announcement = await Context.BulkmailAnnouncement
.Where(x => x.PackageTrackingIdentifications.Any(y => y.Value == packageTrackingIdentification) &&
x.AuditReportIndicator != true)
.FirstAsync();
var announcement2 = await Context.BulkmailAnnouncement
.Include(x => x.Tarras)
.Include(x => x.PackageTrackingIdentifications)
.Where(x => x.CustomerOrderId == announcement.CustomerOrderId && x.CustomerPartyAccountId == announcement.CustomerPartyAccountId)
.ToListAsync();
var resultAnnouncement = announcement.Concat(announcement2);
return resultAnnouncement;