c# - Linq 根据子对象集合过滤父对象
问题描述
如何根据应用的子对象过滤器过滤父对象集合?
下面是我正在搜索具有所有提到的客户端 ID 值searchClientsList
以匹配子对象(即 UserClients 列表)的用户的场景。
我希望获得确切的 Linq 查询,以仅通过一个符合所需条件的用户(用户 1001)获得预期结果。以下是可供参考的示例代码片段。
using System;
using System.Linq;
using System.Collections.Generic;
namespace ConsoleApp1
{
class User
{
public int UserID { get; set; }
public List<UserClient> UserClients { get; set; }
}
class Client
{
public int ClientID { get; set; }
public int UserID { get; set; }
}
class UserClient
{
public int ClientID { get; set; }
public int UserID { get; set; }
public DateTime StartDate { get; set; }
}
class Program
{
static void Main(string[] args)
{
List<int> searchClientsList = new List<int> { 1, 2};
List<User> users = GetTestData();
var result = users.Where(x => x.UserClients.Any(y => searchClientsList.Contains(y.ClientID) && y.UserID== x.UserID)).ToList(); //To work on Query.
Console.WriteLine("The above result should return list of users with userclients having all the clientIds mentioned in searchClientsList.");
Console.WriteLine("In this case, it should return only User1 when searchClientsList is [1,2].");
}
private static List<User> GetTestData() {
User user1 = new User()
{
UserID = 1001,
UserClients = new List<UserClient>() { new UserClient { UserID = 1001, ClientID = 1 }, new UserClient { UserID = 1001, ClientID = 2 } , new UserClient { UserID = 1001, ClientID = 3 } }
};
User user2 = new User()
{
UserID = 1002,
UserClients = new List<UserClient>() { new UserClient { UserID = 1002, ClientID = 2 }, new UserClient { UserID = 1002, ClientID = 3 } }
};
List <User> users = new List<User>();
users.Add(user1);
users.Add(user2);
return users;
}
}
}
解决方案
就像您在代码中提到的那样: 上面的结果应该返回具有 userclients 的用户列表,其中包含searchClientsList中提到的所有clientId,因此您应该使用.All而不是.Contains:
List<int> searchClientsList = new List<int> { 1, 2 };
List<User> users = GetTestData();
List<User> result = users
.Where(x => searchClientsList.All(clientId => x.UserClients.Any(y => y.ClientID == clientId && y.UserID == x.UserID)))
.ToList();
foreach (var user in result)
{
Console.WriteLine(user.UserID);
}
我希望你觉得这有帮助。
推荐阅读
- python - Python:子进程在 crontab 中不起作用
- android - Angular 5,从图像中获取颜色
- reactjs - React Helmet 不适用于构建命令
- r - 使用 openNLP 在 R 中提取自定义实体
- jmeter - 如何在 JMETER CSV 中查看完整的请求和完整的响应
- javascript - Office.js 在搜索中转义特殊字符
- swift - 从“(键:字符串,值:NSObject)”转换为不相关的类型“字典”
' 总是失败 - php - 如何在html中包含perl脚本
- java - LOG4J:lo4j.xml 中的错误
- django - 在 Django DRFs 的 `ListCreateAPIView` POST 方法中,我们如何获取模型字段的 pk?