使用 LINQ 根据列表中存在的匹配 ID 过滤数据

Filtering data based on matching ids present in a list using LINQ

我编写了一个程序,可以根据来自另一个列表的 ID 列表过滤数据列表。执行 LINQ 查询后,我只想返回那些仅与过滤条件中存在的数据相匹配的数据。

我的程序是这样的

public class MarketplacePackageInfo
{
    public string PackageId { get; set; }
    public string PackageName { get; set; } 
    public List<AppInfo> Apps { get; set; }
}

public class AppInfo
{
    public string AppName { get; set; }    
    public string AppId { get; set; }
    
}


List<string>appIds=new List<string>();
appIds.Add("a1");
appIds.Add("a2");

List<MarketplacePackageInfo> packageList = new List<MarketplacePackageInfo>();
MarketplacePackageInfo pacakage1 = new MarketplacePackageInfo();
pacakage1.PackageId = "P1";
pacakage1.PackageId = "Package1";
pacakage1.Apps=new List<AppInfo>();
pacakage1.Apps.Add(new AppInfo { AppId = "a1",AppName="app1" });
pacakage1.Apps.Add(new AppInfo { AppId = "a2", AppName = "app2" });
pacakage1.Apps.Add(new AppInfo { AppId = "a3", AppName = "app3" });
packageList.Add(pacakage1);

MarketplacePackageInfo pacakage2 = new MarketplacePackageInfo();
pacakage2.PackageId = "P2";
pacakage2.PackageId = "Package2";
pacakage2.Apps = new List<AppInfo>();
pacakage2.Apps.Add(new AppInfo { AppId = "a1", AppName = "app1" });
pacakage2.Apps.Add(new AppInfo { AppId = "a2", AppName = "app2" }); 
packageList.Add(pacakage2);

MarketplacePackageInfo pacakage3 = new MarketplacePackageInfo();
pacakage3.PackageId = "P3";
pacakage3.PackageId = "Package3";
pacakage3.Apps = new List<AppInfo>();
pacakage3.Apps.Add(new AppInfo { AppId = "a2", AppName = "app2" });
pacakage3.Apps.Add(new AppInfo { AppId = "a3", AppName = "app3" });
packageList.Add(pacakage3);

MarketplacePackageInfo pacakage4 = new MarketplacePackageInfo();
pacakage4.PackageId = "P4";
pacakage4.PackageId = "Package4";
pacakage4.Apps = new List<AppInfo>();

pacakage4.Apps.Add(new AppInfo { AppId = "a2", AppName = "app2" });
pacakage4.Apps.Add(new AppInfo { AppId = "a3", AppName = "app3" });
pacakage4.Apps.Add(new AppInfo { AppId = "a4", AppName = "app4" });
packageList.Add(pacakage4);

var filterList= packageList.Where(e => e.Apps.Where(a => !appIds.Contains(a.AppId)).Count() > 0).ToList();

我想要的输出是我将只获得 package2,因为这两个应用程序都存在并且没有额外的应用程序。但它正在返回不应该出现的 Package1、package 和 package4 的数据。如何编写该查询?

您可以尝试以下给出相同结果的语句:

var filterList = packageList.Where(e => e.Apps.Count(apps => !appIds.Contains(apps.AppId)) == 0).ToList();

或者使用 All 我认为在可读性方面更好

var filterList = packageList.Where(e => e.Apps.All(apps => appIds.Contains(apps.AppId))).ToList();

他们都为您提供的软件包(在本例中为 package2)仅包含 appIds 中的应用程序,没有其他应用程序。