通过 LookUp/Something 更好地获取子元素

Obtaining Child element via LookUp/Something better

我正在尝试获取父元素的子元素。我有一个基本的数据库:

public class list
{
    public int id { get; set; }
    public List<Users> UsersList{ get; set; }

    public class Users
    {
        [Key]
        public int Users_id{ get; set; }
        public string UserId { get; set; }
    }
}

如果我想获取 Users 中具有特定 UserId 的所有元素,我该怎么做?我试图避免使用嵌套的 for 循环并遍历我在数据库中的所有 List 和 Users 条目。我正在查找 LookUp(),但对如何在这种情况下应用它感到有点困惑。任何帮助都会很棒!

既然你有点困惑,我会提供比我原来的答案更详细的信息。让我们用你的代码创建一个非常基本和粗糙的示例程序:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;

namespace SOSample
{
    public class list
    {
        public int id { get; set; }
        public List<Users> UsersList { get; set; }

        public class Users
        {
            [Key]
            public int Users_id { get; set; }
            public string UserId { get; set; }
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            // Instantiate and initialize with sample data.
            var sampleList = new list()
            {
                id = 12345,
                UsersList = new List<list.Users>()
                {
                    new list.Users() { Users_id = 1, UserId = "0042" },
                    new list.Users() { Users_id = 2, UserId = "0019" },
                    new list.Users() { Users_id = 3, UserId = "0036" },
                    new list.Users() { Users_id = 4, UserId = "0214" },
                    new list.Users() { Users_id = 5, UserId = "0042" },
                    new list.Users() { Users_id = 6, UserId = "0042" },
                    new list.Users() { Users_id = 7, UserId = "0019" }
                }
            };

            // Linq search.
            var someId = "0042";
            var linqQuery = sampleList.UsersList.Where(user => user.UserId == someId);

            Console.WriteLine("Linq query results:");
            foreach (var r in linqQuery)
            {
                Console.WriteLine($"Users_id: {r.Users_id}, UserId: {r.UserId}");
            }

            // Lookup search (using same someId as for Linq).
            var lookup = sampleList.UsersList.ToLookup(user => user.UserId);
            var lookupQuery = lookup[someId];

            Console.WriteLine("\nLookup query results:");
            foreach (var r in lookupQuery)
            {
                Console.WriteLine($"Users_id: {r.Users_id}, UserId: {r.UserId}");
            }
        }
    }
}

输出:

Linq query results:
Users_id: 1, UserId: 0042
Users_id: 5, UserId: 0042
Users_id: 6, UserId: 0042

Lookup query results:
Users_id: 1, UserId: 0042
Users_id: 5, UserId: 0042
Users_id: 6, UserId: 0042

希望澄清事情。我在您的问题和评论中看到的主要问题是您可能将嵌套的 classes 误认为是属性。当您实例化外部 class 时,内部 class 不会被实例化,它不是外部 class.

的某种 属性

旧答案(提供个人详细信息):

我喜欢使用 Linq。因此,假设 sampleListlist 类型:

var query = sampleList.UsersList.Where(user => user.UserId == someId);

这会给你 IEnumerable<list.Users>。您始终可以使用 ToList()ToArray()ToDictionary() 来获取所需的集合类型:

var results = sampleList.UsersList.Where(user => user.UserId == someId).ToArray();

至于 Lookup,我见过它的几种使用方式,但对我来说最熟悉的方式是:

var lookup = sampleList.UsersList.ToLookup(user => user.UserId);
var query = lookup[someId];

再一次,这会给你 IEnumerable<list.Users>。或者,您可以从该查询中获取您选择的集合类型:

var results = lookup[someId].ToArray();

基本上,您要指定该键在该查找中代表的内容(在本例中为 UserId),然后在时机成熟时按键搜索。