動くコード図鑑技術記事現場の渡り方キャリア論すべての記事About

動くコード図鑑

$ ls -1 /library | wc -l → 619

触って動く、検証済みの正解集。

公開記事から抽出した全コードブロックを 1 つずつページ化。 ▶ ボタンで 実行ログを再生し、 さも今動いてるかのように出力を流す。

この図鑑の使い方

言語で絞る

C# / SQL / TypeScript / PowerShell / Bash でフィルタ。

▶ で実行

事前収録の出力を 1 行ずつ再生。 ぱっと結果が見える。

記事と接続

各 snippet は出典記事へのリンク付き。 文脈ごと読める。

絞り込み

snippet 一覧

473
C#
// 開発時はこれで動いた
var customers = db.Customers.ToList();
foreach (var c in customers) {
    // 顧客ごとに c.Orders を見る ← ここで1ループに1 SQL 飛ぶ
    Console.WriteLine($"{c.Name}: 注文 {c.Orders.Count()} 件");
▶ 実行可

なぜ「LINQ 書いたら SQL が爆発する」のか

EF6 + LINQ で N+1 問題を踏まない3つの書き方#044de404ad21
C#
class Customer { public int Id; public string Name = ""; }
class Order { public int Id; public int CustomerId; public int Amount; }

var customers = new List<Customer> {
    new() { Id = 1, Name = "A社" },
▶ 実行可

パターン1: 罠 (Include 忘れ + foreach 内 navigation)

EF6 + LINQ で N+1 問題を踏まない3つの書き方#19cd61cdd189
C#
// EF6 (.NET Fx 4.7.2)・これが本番で爆発するやつ
using var db = new MyDbContext();
var customers = db.Customers.ToList();   // SQL #1: SELECT * FROM Customers
foreach (var c in customers) {
    var count = c.Orders.Count();        // ループのたびに SQL 追加発行
▶ 実行可

パターン1: 罠 (Include 忘れ + foreach 内 navigation)

EF6 + LINQ で N+1 問題を踏まない3つの書き方#0cd0b26748ea
C#
// EF6 (.NET Fx 4.7.2)・Include で関連を1クエリにまとめる
using var db = new MyDbContext();
var customers = db.Customers
    .Include(c => c.Orders)             // JOIN Orders を含める
    .ToList();                           // SQL #1: SELECT ... FROM Customers c LEFT JOIN Orders o ...
▶ 実行可

パターン2: Include で eager loading (1クエリで関連ごと取得)

EF6 + LINQ で N+1 問題を踏まない3つの書き方#8a5aff026173
C#
Console.WriteLine("[SQL #1] SELECT c.*, o.* FROM Customers c LEFT JOIN Orders o ON c.Id = o.CustomerId");
var customersWithOrders = customers
    .GroupJoin(orders,
        c => c.Id,
        o => o.CustomerId,
▶ 実行可

パターン2: Include で eager loading (1クエリで関連ごと取得)

EF6 + LINQ で N+1 問題を踏まない3つの書き方#a218fe1f714f
C#
// EF6 (.NET Fx 4.7.2)・Select で必要な列だけ射影
using var db = new MyDbContext();
var summary = db.Customers
    .Select(c => new {
        c.Name,
▶ 実行可

パターン3: Select 射影で1クエリ集計 (画面に出す列だけ)

EF6 + LINQ で N+1 問題を踏まない3つの書き方#ea190218fcb0
C#
Console.WriteLine("[SQL #1] SELECT c.Name, (SELECT COUNT(*) FROM Orders o WHERE o.CustomerId = c.Id) AS OrderCount, (SELECT ISNULL(SUM(o.Amount),0) FROM Orders o WHERE o.CustomerId = c.Id) AS TotalAmount FROM Customers c");
var summary = customers
    .Select(c => new {
        c.Name,
        OrderCount = orders.Count(o => o.CustomerId == c.Id),
▶ 実行可

パターン3: Select 射影で1クエリ集計 (画面に出す列だけ)

EF6 + LINQ で N+1 問題を踏まない3つの書き方#9ac91d59371f
C#
// これが地雷
IQueryable<Order> recentOrders = db.Orders.Where(o => o.OrderDate > DateTime.Now.AddDays(-7));

var count = recentOrders.Count();          // SQL #1: SELECT COUNT(*) ...
var first = recentOrders.FirstOrDefault(); // SQL #2: SELECT TOP(1) ...
▶ 実行可

ハマりポイント: LINQ 遅延実行と「複数列挙」の罠

EF6 + LINQ で N+1 問題を踏まない3つの書き方#a1cd6d0618df
C#
for(int i = 0 ; i < 50; i++)
{

  if(i % 5 == 0 && i % 3 == 0)
    Console.WriteLine("FizzBuzz")

コードをブログに張り付ける

エンジニアが技術ブログの書き方と書く目的を振り返る未収録#4f2dcaf56d42
C#
namespace Linq
{
    internal class Program
    {
        public static void Main(string[] args)
▶ 実行可

FizzBuzz1行のコード

FizzBuzz問題が1行で書けたのでその解説#93309a6c8c59
C#
namespace IncludeStudy.Models
{
    public class Company
    {
        public int Id { get; set; }

発端はModel参照がNullになっていたこと

Asp.Net Core ApiのIncludeの使い方で盛大な勘違いをしていた件未収録#b6a2ab2a378c
C#
        // GET: api/Companies/5
        [HttpGet("{id}/emp")]
        public async Task<ActionResult<ICollection<Employee>>> GetCompanyEmp(int id)
        {
            var company = await _context.Company.FindAsync(id);

発端はModel参照がNullになっていたこと

Asp.Net Core ApiのIncludeの使い方で盛大な勘違いをしていた件未収録#64b70b0853f0
C#
    public class Todo
    {
        public int Id { get; set; }
        public string Sammary { get; set; }
        public string Detail { get; set; }

TodoMODELの構造

ASP.NETでCreate時にログイン中ユーザーのデータとして登録する方法未収録#38715cea3d9b
C#
    public class User
    {
        public int id { get; set; }
        public string UserName { get; set; }
        public string Password { get; set; }

UserModelの構造

ASP.NETでCreate時にログイン中ユーザーのデータとして登録する方法未収録#17084a70a2be
C#
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Create([Bind(Include = "Id,Sammary,Detail,Limit,Done")] Todo todo)
        {
            var loginUser = GetLoginUser();

TodoModelがUserを保持している点に注目

ASP.NETでCreate時にログイン中ユーザーのデータとして登録する方法未収録#0c46100ec080
C#
        private User GetLoginUser()
        {
            return db.Users.FirstOrDefault(u => u.UserName == User.Identity.Name);
        }

TodoModelがUserを保持している点に注目

ASP.NETでCreate時にログイン中ユーザーのデータとして登録する方法未収録#31edbf235b99
C#
namespace sqlserver_connection_demo.Models
{
    public class User
    {
        public int ID { get; set; }

Modelを作る

【C#】Asp.net Core EFでSqlServerに対しマイグレーションをする方法未収録#89e3af841026
C#
using Microsoft.EntityFrameworkCore;

namespace sqlserver_connection_demo.Models
{
    public class DemoContext : DbContext

Contextを作る

【C#】Asp.net Core EFでSqlServerに対しマイグレーションをする方法未収録#79dce8b7ef74
C#
namespace sqlserver_connection_demo
{
    public class Startup
    {
        public Startup(IConfiguration configuration)

Start.csを修正する

【C#】Asp.net Core EFでSqlServerに対しマイグレーションをする方法未収録#ec0b6d60debc
C#
        private SqlConnectionStringBuilder stringBuilder = new SqlConnectionStringBuilder()
        {
            InitialCatalog = "DemoDB",
            DataSource = "localhost",
            UserID = "sa",

Start.csを修正する

【C#】Asp.net Core EFでSqlServerに対しマイグレーションをする方法未収録#8e195404d5da
C#
            services.AddDbContext<DemoContext>(opt =>
            {
                opt.UseSqlServer(stringBuilder.ToString());
            });

Start.csを修正する

【C#】Asp.net Core EFでSqlServerに対しマイグレーションをする方法未収録#16ca3ab0fab2
C#
        private DataTable getDataTable()
        {
            var dt = new DataTable();
            var idCol = dt.Columns.Add("ID");
            var nameCol = dt.Columns.Add("氏名");

DataTableの定義

【C#】DataGridViewにDataTable反映したり変換して取得したりする未収録#a4a95e25ff1d
C#
        private void Form1_Load(object sender, EventArgs e)
        {
            dataGridView1.DataSource = getDataTable();
        }

DataGridViewのDataSourceに反映させる

【C#】DataGridViewにDataTable反映したり変換して取得したりする未収録#90454beb1e12
C#
        private void Form1_Load(object sender, EventArgs e)
        {
            dataGridView1.DataSource = getDataTable();

        // 列名を自由に変更する。

余談1:列名を変更したいならColumnNameのプロパティを触る

【C#】DataGridViewにDataTable反映したり変換して取得したりする未収録#e971cd5ead3c
C#
    public class User
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public int Age { get; set; }

余談2:CustomClassもDataSourceにできます

【C#】DataGridViewにDataTable反映したり変換して取得したりする未収録#ab4b87efdb29
C#
        private IEnumerable<User> GetUsers()
        {
            var user1 = new User(1, "鈴木 おさむ",22, "東京都世田谷区");
            var user2 = new User(2, "高橋 つよし",25, "東京都葛飾区");

余談2:CustomClassもDataSourceにできます

【C#】DataGridViewにDataTable反映したり変換して取得したりする未収録#5c9fd7e063bb
C#
        private void Form1_Load(object sender, EventArgs e)
        {
            //dataGridView1.DataSource = getDataTable();

        //// 列名を自由に変更する。

余談2:CustomClassもDataSourceにできます

【C#】DataGridViewにDataTable反映したり変換して取得したりする未収録#9e611e145e57
C#
        private void button1_Click(object sender, EventArgs e)
        {
            var data = (DataTable)dataGridView1.DataSource;
            dataGridView2.DataSource = data;
        }

DataGridViewをDataTableに変換して取得するには?

【C#】DataGridViewにDataTable反映したり変換して取得したりする未収録#1d1e363b3ea6
C#
        private void button1_Click(object sender, EventArgs e)
        {
            var data = (DataTable)dataGridView1.DataSource;
            var newDt = data.Copy();

このままだと同じインスタンスになってるので、左右で同じ動きになってしまう。

【C#】DataGridViewにDataTable反映したり変換して取得したりする未収録#f5f19b5032c8
C#
// ✅ C#側でループする(DataReader版)
using (var conn = new SqlConnection(_connectionString))
using (var cmd = new SqlCommand("SELECT id, name FROM target_table WHERE status = 0", conn))
{
    conn.Open();

C#側との連携— DataReaderでクライアント側ループに寄せる選択肢

SQL Server のカーソルを使うべきタイミングと書き方(業務SE現場の判断軸)未収録#adcfd19ba723