C# でデータを読むときの基本は IModuleDataService(フロント)または ModuleDataIO(サーバー)に
SearchCondition を渡す形です。ModuleDataIOExtensions はこの記述を
モジュールに対応した C# クラス + LINQ ライクな書き方で簡単に行うための拡張メソッド群です。
using Codeer.LowCode.Blazor.DataIO; // 拡張メソッド / MatchComparisonHelper
using Codeer.LowCode.Blazor.Repository.Match; // SearchCondition<T>取得対象のモジュールを表す C# クラスを用意します。手書きせずデザイナから生成できます。
- ソリューションエクスプローラーでモジュールを右クリック → Create FieldData Class
生成されるクラスは次のような形です。
public class Customer
{
public IdFieldData? Id { get; set; }
public TextFieldData? Name { get; set; }
public NumberFieldData? Age { get; set; }
public SelectFieldData? Rank { get; set; }
public LinkFieldData? Company { get; set; }
[Link]
public TextFieldData? Company_Name { get; set; } // 関連先 Company の Name フィールド
}- クラス名 = モジュール名
- プロパティ = フィールド(型は
TextFieldDataなどの各フィールドのデータ型、値は.Valueで読みます) - 関連先(リンク先)のフィールドは
[Link]属性を付け、関連フィールド名_フィールド名のように_区切りで書きます(例:Company_Nameは関連先CompanyのName)
条件にマッチする全データを取得します。
// 全件
var all = await service.GetListAsync<Customer>();
// 条件付き(式で書く)
var adults = await service.GetListAsync<Customer>(e => e.Age!.Value >= 20);service はフロントなら IModuleDataService、サーバーなら ModuleDataIO です。どちらも同じ書き方ができます。
複雑な条件や並び替えが必要なときは SearchCondition<T> をメソッドチェーンで組み立ててから渡します。
var condition = new SearchCondition<Customer>()
.Where(e => e.Age!.Value >= 20)
.Where(e => e.Company_Name!.Value == "Codeer") // Where を重ねると AND 連結
.OrderByDescending(e => e.Age!.Value)
.ThenBy(e => e.Name!.Value)
.Take(50);
var list = await service.GetListAsync(condition);| メソッド | 説明 |
|---|---|
Where(式) |
条件を追加。複数回呼ぶと AND で連結されます |
AddParameter(フィールド, 値) |
指定フィールドに値をセット(後述) |
Select(フィールド, ...) |
取得するフィールドを限定します(既定は全フィールド) |
OrderBy / OrderByDescending |
並び替え |
ThenBy / ThenByDescending |
2 番目以降の並び替えキー |
Take(件数) |
取得件数の上限 |
- 比較演算子:
==!=<<=>>= - 論理演算子:
&&||! - 右辺には定数・変数・配列の要素・メソッドの戻り値などを使えます
var keyword = "山田";
var ranks = new[] { "A", "B" };
var condition = new SearchCondition<Customer>()
.Where(e => MatchComparisonHelper.Like(e.Name!.Value, keyword)) // 部分一致
.Where(e => MatchComparisonHelper.In(e.Rank!.Value, ranks)); // いずれかに一致MatchComparisonHelper には Like / In / NotIn があります。
式の中で使えない書き方 条件式はフィールドと値の比較を組み立てるためのもので、次のような書き方はできません(エラーになります)。代わりに用意されたヘルパを使ってください。
書きたいこと 使えない書き方 代わりに 部分一致 e.Name!.Value!.Contains("山田")/StartsWith/EndsWithMatchComparisonHelper.Like(e.Name!.Value, "山田")いずれかに一致 list.Contains(e.Rank!.Value)MatchComparisonHelper.In(e.Rank!.Value, list)フィールド同士の比較 e.A!.Value == e.B!.Value(未対応。値との比較のみ)
QueryField のように、あらかじめ用意した SQL にパラメータを持たせている場合は、
複雑な条件を組むのではなくパラメータに値をセットするだけです。その用途には AddParameter を使います。
// 例: where 句に @Month を持つクエリに値を渡す
var condition = new SearchCondition<SalesSummary>()
.AddParameter(e => e.Month!.Value, "2026-05");
var rows = await service.GetListAsync(condition);フロントからは、複数のクエリを 1 回の通信でまとめて実行できます。往復回数が減り通信コストを抑えられます。
var result = await service.GetListAsync(
new SearchCondition<Customer>().Where(e => e.Age!.Value >= 20),
new SearchCondition<Order>().Where(e => e.Status!.Value == "open"));
var customers = result.Find<Customer>(); // 型で取り出す
var orders = result.GetAt<Order>(1); // 渡した順番(インデックス)で取り出すFind<T>()… 渡したクエリの中から型Tに一致するものを取り出します(無ければ空リスト)GetAt<T>(index)… 渡した順番で取り出します
このまとめ取得は通信を伴うフロント(
IModuleDataService)向けの機能です。サーバー側のModuleDataIOは通信を伴わないため提供していません。
- これらのヘルパは読み取り用です。ページングは扱わず「条件にマッチする全データ」を取得します。件数を抑えたいときは
Takeを使ってください。細かいページ制御が必要な場合はModuleDataIO.GetListAsync(condition, pageIndex)を直接使います。 - 書き込み(追加・更新・削除)は プロコードでのデータ保存(追加・更新・削除) を参照してください。
- 検索条件に一致するデータをまとめて削除したい場合は 検索条件でまとめて削除する(SearchDelete) を参照してください。