合并2个linq查询,使用1中的结果继续搜索

时间:2019-05-23 11:16:13

标签: c# linq entity-framework-core

目前,我已经写了这个:

    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的列表,它们都具有相同的customerOrderIdCustomerPartyId

为了找出哪个customerOrderIdCustomerPartyId,我首先需要找到1个bulkmailAnnouncement,它的packageTrackingIdentification等于方法的参数。然后使用该bulkmailAnnouncement查找具有相同的customerOrderIdCustomerPartyId的所有其他公告。

3 个答案:

答案 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的所有其他公告。

然后通过CustomerOrderIdCustomerPartyAccountId属性对结果进行分组,并采用第一组,例如:

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;