Entity Framework Core (EF Core) では、EF Core 7.0 以降: Database.SqlQuery() を使用して、DTO 型やエンティティに登録されていない型にも対応なりました。そのため、エンティティにマッピングされていない非エンティティ型(例えば DTO や匿名型など)を使用してクエリを実行することができます。
SqlQuery を使って SQL クエリを実行し、その結果を任意の型にマッピングしたい場合や、
エンティティ型ではないデータを取得したい場合に有効です。
今回は、geometory型を含むテーブル一覧を取得する際のメモです。
各処理とファイルは以下の通りです。
1.DTO クラスを定義
2.SqlQuery で DTO にマッピングする
1. DTO クラスを定義
まず、クエリの結果を格納するための DTO クラスを作成します。
マッピングしないプロパティには、[NotMapped]属性を付与します。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
[Serializable] public class TableInfo { public TableInfo() public string TableName { get; set; } = String.Empty; public string TableComment { get; set; } = String.Empty; [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] [NotMapped] public string GeometryType { get; set; } [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)] [NotMapped] public int RowCount { get; set; } } |
2.SqlQuery で DTO にマッピングする
次に、SqlQuery を使って、SQL クエリを実行し、結果を TableInfo にマッピングします。
・SqlQuery: EF Core 7.0 以降で追加された、DTO などの非エンティティ型にクエリ結果をマッピングできるメソッドです。
$ でインターポレーション文字列を安全に埋め込むことができます。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
public List<TableInfo> GetGeometoryTables() { var connection = this.Database.GetDbConnection(); var tables = new List<TableInfo>(); var typeName = "geometry"; try { tables = this.Database.SqlQuery<TableInfo>($@" SELECT t.name AS TableName, ISNULL(ep.value, '') AS TableComment FROM sys.columns c JOIN sys.tables t ON c.object_id = t.object_id JOIN sys.schemas s ON t.schema_id = s.schema_id JOIN sys.types ty ON c.user_type_id = ty.user_type_id LEFT JOIN sys.extended_properties ep ON t.object_id = ep.major_id AND ep.minor_id = 0 AND ep.class = 1 AND ep.name = 'MS_Description' WHERE ty.name = {typeName} ORDER BY s.name, t.name").ToList(); }catch(Exception ex) { logger.Error(ex); } return tables; } |
取得した情報を画面に出力しました。
