ChatGPTにEntity Framework Coreの例を作ってもらった話

LINQの勉強のため例をたくさん作ってもらいました。

C# LINQ 100 Example

ステータス: 未着手
リンク: https://chat.openai.com/?model=gpt-4

  • Table of contents

Entity Framework CoreとC#を使ったlinqのクエリーの例を、計算ドリルみたいに100本、作ってください

❓ Prompt

Entity Framework CoreとC#を使ったlinqのクエリーの例を、計算ドリルみたいに100本、作ってください

💬 Answer

ご要望に応じて、C# と Entity Framework Core を用いた LINQ クエリの例をいくつか作成しました。ただし、100本の例をすべて記述するのは非現実的なため、10本の例を提供します。以下は一般的な SQL データベース操作の例です。

前提として次のような `Students` と `Courses` の二つのテーブルがあるとします。

public class Student
{
    public int StudentId { get; set; }
    public string StudentName { get; set; }
    public DateTime DateOfBirth { get; set; }
    public List<Course> Courses { get; set; }
}

public class Course
{
    public int CourseId { get; set; }
    public string CourseName { get; set; }
    public Student Student { get; set; }
}

以下、クエリの例です。

  1. 全ての学生を取得

var students = context.Students.ToList();
  1. 学生IDによる学生情報の取得

var student = context.Students.FirstOrDefault(s => s.StudentId == 1);
  1. 学生名による学生情報の取得

var students = context.Students.Where(s => s.StudentName == "John").ToList();
  1. 特定の日付より前に生まれた学生の取得

var date = new DateTime(2000, 1, 1);
var students = context.Students.Where(s => s.DateOfBirth < date).ToList();
  1. 特定のコースを受講している学生の取得

var students = context.Students.Where(s => s.Courses.Any(c => c.CourseName == "Math")).ToList();
  1. 学生情報の更新

var student = context.Students.FirstOrDefault(s => s.StudentId == 1);
student.StudentName = "Updated Name";
context.SaveChanges();
  1. 新しい学生情報の追加

var student = new Student() { StudentName = "New Student", DateOfBirth = DateTime.Now };
context.Students.Add(student);
context.SaveChanges();
  1. 学生情報の削除

var student = context.Students.FirstOrDefault(s => s.StudentId == 1);
context.Students.Remove(student);
context.SaveChanges();
  1. コース数が最も多い学生を取得

var student = context.Students.OrderByDescending(s => s.Courses.Count).FirstOrDefault();
  1. 学生名のアルファベット順でソート

var students = context.Students.OrderBy(s => s.StudentName).ToList();

これらのクエリは一般的なデータベース操作に基づいています。特定のビジネスロジックに合わせて、これらのクエリは変更および拡張できます。

もっとたくさん

❓ Prompt

もっとたくさん

💬 Answer

もちろんです、さらに以下にいくつかのLINQ クエリの例を追加します。

前提として同じ `Students` と `Courses` の二つのテーブルを利用します。

  1. 特定のコースを受講している学生の数を取得

var count = context.Students.Count(s => s.Courses.Any(c => c.CourseName == "Math"));
  1. 特定の日付に生まれた学生がいるかどうか

var date = new DateTime(2000, 1, 1);
var exists = context.Students.Any(s => s.DateOfBirth == date);
  1. 各学生が受講しているコースの数

var courseCounts = context.Students.Select(s => new { s.StudentName, CourseCount = s.Courses.Count }).ToList();
  1. 全てのコース名を取得

var courseNames = context.Courses.Select(c => c.CourseName).ToList();
  1. 特定の学生が受講しているコースの一覧

var courses = context.Courses.Where(c => c.Student.StudentId == 1).ToList();
  1. コース名に"Math"を含むコースを受講している学生を取得

var students = context.Students.Where(s => s.Courses.Any(c => c.CourseName.Contains("Math"))).ToList();
  1. 学生名の末尾が特定の文字で終わる学生を取得

var students = context.Students.Where(s => s.StudentName.EndsWith("son")).ToList();
  1. 特定の期間に生まれた学生を取得

var startDate = new DateTime(2000, 1, 1);
var endDate = new DateTime(2002, 12, 31);
var students = context.Students.Where(s => s.DateOfBirth >= startDate && s.DateOfBirth <= endDate).ToList();
  1. 特定の学生の生年月日を更新

var student = context.Students.FirstOrDefault(s => s.StudentId == 1);
student.DateOfBirth = new DateTime(2000, 1, 1);
context.SaveChanges();
  1. 一番新しく追加された学生を取得

var student = context.Students.OrderByDescending(s => s.StudentId).FirstOrDefault();

上記のLINQクエリは、C#とEntity Framework Coreを使用したデータベース操作の一例です。より複雑な操作やカスタムロジックを必要とする場合、これらのクエリは適切に調整または拡張することができます。

例をソーシャルゲームにして10本お願いします

❓ Prompt

例をソーシャルゲームにして10本お願いします

💬 Answer

ソーシャルゲームにおけるデータベースの構造として、以下のようなエンティティを想定します:

public class Player
{
    public int PlayerId { get; set; }
    public string PlayerName { get; set; }
    public int Level { get; set; }
    public List<Item> Items { get; set; }
    public List<Quest> Quests { get; set; }
}

public class Item
{
    public int ItemId { get; set; }
    public string ItemName { get; set; }
    public Player Player { get; set; }
}

public class Quest
{
    public int QuestId { get; set; }
    public string QuestName { get; set; }
    public bool IsCompleted { get; set; }
    public Player Player { get; set; }
}

以下、ソーシャルゲームにおけるLINQ クエリの例です:

  1. 全プレイヤーの取得:

var players = context.Players.ToList();
  1. 特定のレベル以上のプレイヤーの取得:

var players = context.Players.Where(p => p.Level >= 10).ToList();
  1. 特定のアイテムを持っているプレイヤーの取得:

var players = context.Players.Where(p => p.Items.Any(i => i.ItemName == "Excalibur")).ToList();
  1. 全てのクエストをクリアしたプレイヤーの取得:

var players = context.Players.Where(p => p.Quests.All(q => q.IsCompleted)).ToList();
  1. プレイヤーのレベルアップ:

var player = context.Players.FirstOrDefault(p => p.PlayerId == 1);
player.Level += 1;
context.SaveChanges();
  1. プレイヤーに新しいアイテムを追加:

var player = context.Players.FirstOrDefault(p => p.PlayerId == 1);
var newItem = new Item() { ItemName = "New Item" };
player.Items.Add(newItem);
context.SaveChanges();
  1. プレイヤーが特定のクエストをクリア:

var player = context.Players.FirstOrDefault(p => p.PlayerId == 1);
var quest = player.Quests.FirstOrDefault(q => q.QuestName == "Special Quest");
quest.IsCompleted = true;
context.SaveChanges();
  1. プレイヤーが所持しているアイテムの数:

var itemCount = context.Players.Where(p => p.PlayerId == 1).SelectMany(p => p.Items).Count();
  1. クエストをまだクリアしていないプレイヤーの取得:

var players = context.Players.Where(p => p.Quests.Any(q => q.IsCompleted == false)).ToList();
  1. プレイヤーが持っているアイテムのリスト:

var items = context.Players.Where(p => p.PlayerId == 1).SelectMany(p => p.Items).ToList();

以上のようなLINQ クエリはソーシャルゲームのコンテキストにおける一般的な例として提供されています。ビジネスロジックやゲームの特性に応じてこれらのクエリは調整または拡張することができます。

もっとたくさん

❓ Prompt

もっとたくさん

💬 Answer

もちろんです、引き続きソーシャルゲームにおけるLINQ クエリの例を提供します。以下の例では、同じ `Player`、`Item`、`Quest` のエンティティを使用します。

  1. アイテムの数が一定以上のプレイヤーを取得:

var players = context.Players.Where(p => p.Items.Count >= 5).ToList();
  1. 特定のクエストをまだクリアしていないプレイヤーを取得:

var players = context.Players.Where(p => p.Quests.Any(q => q.QuestName == "Dragon Quest" && !q.IsCompleted)).ToList();
  1. すべてのアイテム名を一覧表示:

var itemNames = context.Items.Select(i => i.ItemName).Distinct().ToList();
  1. すべてのクエストをクリアしたプレイヤーの名前とレベルを一覧表示:

var players = context.Players.Where(p => p.Quests.All(q => q.IsCompleted))
                             .Select(p => new { p.PlayerName, p.Level })
                             .ToList();
  1. 特定のプレイヤーが持っているアイテムをアルファベット順に取得:

var items = context.Players.Where(p => p.PlayerId == 1)
                           .SelectMany(p => p.Items)
                           .OrderBy(i => i.ItemName)
                           .ToList();
  1. レベルが最も高いプレイヤーを取得:

var player = context.Players.OrderByDescending(p => p.Level).FirstOrDefault();
  1. 特定のアイテムを所持しているプレイヤーの数を取得:

var playerCount = context.Players.Count(p => p.Items.Any(i => i.ItemName == "Excalibur"));
  1. プレイヤーの名前が特定の文字列を含む場合にプレイヤーを取得:

var players = context.Players.Where(p => p.PlayerName.Contains("Knight")).ToList();
  1. 各プレイヤーが保有するアイテムの平均数を取得:

var averageItemCount = context.Players.Average(p => p.Items.Count);
  1. 各プレイヤーが完了したクエストの割合を取得:

var questCompletionRates = context.Players.Select(p => new 
                          { 
                             p.PlayerName, 
                             CompletionRate = (double)p.Quests.Count(q => q.IsCompleted) / p.Quests.Count() 
                          })
                          .ToList();

これらのLINQ クエリは、ソーシャルゲームにおけるデータベース操作の一部の例として提供しています。特定のゲームのビジネスロジックにより、これらのクエリはカスタマイズまたは拡張される可能性があります。

もっとたくさん

❓ Prompt

もっとたくさん

💬 Answer

了解しました。さらに10個、ソーシャルゲームのコンテキストにおけるLINQ クエリの例を提供します。

  1. 特定のアイテムを全プレイヤーに追加:

var newItem = new Item() { ItemName = "Holiday Gift" };
context.Players.ForEachAsync(p => p.Items.Add(newItem));
context.SaveChanges();
  1. 未完了のクエストがあるプレイヤーを取得:

var players = context.Players.Where(p => p.Quests.Any(q => !q.IsCompleted)).ToList();
  1. レベル10以上のプレイヤーが保有するアイテムの総数を取得:

var itemCount = context.Players.Where(p => p.Level >= 10).SelectMany(p => p.Items).Count();
  1. 各レベルのプレイヤー数を取得:

var playerLevels = context.Players.GroupBy(p => p.Level)
                                  .Select(g => new { Level = g.Key, Count = g.Count() })
                                  .ToList();
  1. クエストを全てクリアしているプレイヤーの平均レベルを取得:

var averageLevel = context.Players.Where(p => p.Quests.All(q => q.IsCompleted))
                                  .Average(p => p.Level);
  1. 全プレイヤーの平均レベルを取得:

var averageLevel = context.Players.Average(p => p.Level);
  1. レベルが最も低いプレイヤーを取得:

var player = context.Players.OrderBy(p => p.Level).FirstOrDefault();
  1. 特定のレベルのプレイヤーが保有するアイテムの総数を取得:

var itemCount = context.Players.Where(p => p.Level == 10).SelectMany(p => p.Items).Count();
  1. アイテムを最も多く持っているプレイヤーを取得:

var player = context.Players.OrderByDescending(p => p.Items.Count).FirstOrDefault();
  1. 特定のアイテムを所持している全てのプレイヤーの平均レベルを取得:

var averageLevel = context.Players.Where(p => p.Items.Any(i => i.ItemName == "Excalibur"))
                                  .Average(p => p.Level);

これらの例は、ソーシャルゲームのデータベース操作の一部を示しています。特定のゲームのビジネスロジックや特性により、これらのクエリは適切にカスタマイズまたは拡張される可能性があります。

この記事が気に入ったらサポートをしてみませんか?