2016-10-20 9 views
3

3つのモデル(クラス)を持つアプリケーションがあるとします。 すべてのモデルは以下のように、関係のいくつかの種類があります:LINQまたはEF.Coreでこれを行う方法?

ユーザー - >グループ - >データベース

良く説明:

  • ユーザー:クラスどこストアのユーザー名、パスワード、などユーザーが所属するすべてのグループ...したがって、1人のユーザーはを1つ以上持つことができますグループ
  • グループ:このグループにアクセスできるグループ名はデータベースです。あるグループは、の1つ以上のデータベースを持ち、1つ以上ユーザーを持つことができます。
  • データベース:接続のプロパティをデータベースに保存します。

    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.Coreを使って(やはり "直接"の方法で)?

また、私は上記のように、より「長い」方が良いでしょうか?

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クラスを持っています。

答えて

1

MSDN Enumerable.SelectMany例

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

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 Select Many

Examples of DotNetPearls

+0

ようこそ!リンクのみの回答は推奨されず、レビュープロセスで削除される可能性があります。遅かれ早かれリンクが壊れ、答えが役に立たなくなるからです。質問に答えるコードを書くようにしてください。 –

+0

ありがとうございます。私は編集しました。例えば、 –

+0

。あなたのユーザーを取得した後、 'var userDBs = user.Groups.SelectMany(y => y。データベース) ' –

関連する問題