如何在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个类,有一些不同的关系和更多的属性。

如何在LINQ或EF.Core中做到这一点

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示例