如何在LINQ或EF.Core中做到这一点
本文关键字:这一点 Core EF LINQ | 更新日期: 2023-09-27 18:13:59
假设我有一个具有3个模型(类)的应用程序。所有模型都有某种类型的关系,如下所示:
用户->组->数据库
更好的解释:
- User:一个类,存储用户名、密码等,以及用户所属的每个组…因此,一个用户可以拥有一个或多个组。
- 组:只描述组名,以及该组可以访问的数据库。一个组可以有一个或多个数据库,一个或多个Users。
- Database:将连接的属性存储到数据库中。
将其转换为class,可能是这样的:
class User {
public int Id { get; set; }
public string Username { get; set; }
public string Password { get; set; }
public List<Group> Groups { get; set; }
}
class Group {
public int Id { get; set; }
public string Name { get; set; }
public List<User> Users { get; set; } /* inverse */
public List<Database> Databases { get; set; }
}
class Database {
public int Id { get; set; }
public string Hostname { get; set; }
public string Username { get; set; }
public string Password { get; set; }
public string DbName { get; set; }
public List<Group> Groups { get; set; } /* inverse */
}
那么,现在真正的问题是。
假设我只有用户的Id,没有其他信息,并且我想列出该用户可以访问的所有数据库,因此,我必须列出该用户可以访问的所有组,那么在每个组中,我必须列出该组可以访问的所有数据库。
有可能在LINQ中以"直接"的方式实现这一点?或者使用EF。核心(还是"直接"方式)?
或者是更"长"的路,就像我上面描述的那样?
var user = _context.user.code_to_get_user_by_id(id);
var groups = _context.user.code_to_get_all_groups();
var databases = groups.code_to_get_all_databases();
foreach (var group in groups) {
// do something
}
这只是一个简单的例子。我的实际应用程序有4个类,有一些不同的关系和更多的属性。
MSDN Enumerable。
class PetOwner
{
public string Name { get; set; }
public List<String> Pets { get; set; }
}
public static void SelectManyEx1()
{
PetOwner[] petOwners =
{ new PetOwner { Name="Higa, Sidney",
Pets = new List<string>{ "Scruffy", "Sam" } },
new PetOwner { Name="Ashkenazi, Ronen",
Pets = new List<string>{ "Walker", "Sugar" } },
new PetOwner { Name="Price, Vernette",
Pets = new List<string>{ "Scratches", "Diesel" } } };
// Query using SelectMany().
IEnumerable<string> query1 = petOwners.SelectMany(petOwner => petOwner.Pets);
Console.WriteLine("Using SelectMany():");
// Only one foreach loop is required to iterate
// through the results since it is a
// one-dimensional collection.
foreach (string pet in query1)
{
Console.WriteLine(pet);
}
// This code shows how to use Select()
// instead of SelectMany().
IEnumerable<List<String>> query2 =
petOwners.Select(petOwner => petOwner.Pets);
Console.WriteLine("'nUsing Select():");
// Notice that two foreach loops are required to
// iterate through the results
// because the query returns a collection of arrays.
foreach (List<String> petList in query2)
{
foreach (string pet in petList)
{
Console.WriteLine(pet);
}
Console.WriteLine();
}
}
/*
This code produces the following output:
Using SelectMany():
Scruffy
Sam
Walker
Sugar
Scratches
Diesel
Using Select():
Scruffy
Sam
Walker
Sugar
Scratches
Diesel
*/
DotNetPearls SelectMany Example
using System;
using System.Linq;
class Program
{
static void Main()
{
// Input.
string[] array =
{
"dot",
"net",
"perls"
};
// Convert each string in the string array to a character array.
// ... Then combine those character arrays into one.
var result = array.SelectMany(element => element.ToCharArray());
// Display letters.
foreach (char letter in result)
{
Console.WriteLine(letter);
}
}
}
/*
Output:
d
o
t
n
e
t
p
e
r
l
s
*/
可以使用LINQ的SelectMany函数。查看这些链接。
MSDN选择多个
DotNetPearls示例