通过 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。因此,假设 sampleList
是 list
类型:
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
),然后在时机成熟时按键搜索。
我正在尝试获取父元素的子元素。我有一个基本的数据库:
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。因此,假设 sampleList
是 list
类型:
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
),然后在时机成熟时按键搜索。