こんにちは、こだかです。
本日はADO.NET Entity Frameworkの中から、EntityDataModel(EDM)に対するクエリー言語であるEntitySQLについてご紹介したいと思います。EDMにおける問い合わせは、大きく2つの手法が存在しています。1.EntityClientを直接扱う方法 ・・・EntitySQL2.ObjectQueryから問い合わせをかける方法 ・・・EntitySQL ・・・Query builder メソッド ・・・Linq to Entity
Entity SQLは、ADO.NET Entity Framework から提供される Entity Data Model (EDM)をサポートするSQLに似た言語です。Entity SQLはTransact-SQLから派生しており、基本構造と構文はTransact-SQLに非常に似ています。1の手法は、データはDbDataReaderオブジェクトとして取り扱う事になり、今までのデータアクセス手法に非常に似ている為、理解しやすいものになります。例をご覧頂いた方が早いでしょう。この例はpubsデータベースを扱った物になります。
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Data;using System.Data.Common;using System.Data.EntityClient;
namespace EF1{ class Program { static void Main(string[] args) { using (EntityConnection cn = new EntityConnection("Name=pubsEntities")) { cn.Open(); EntityCommand cmd = cn.CreateCommand(); cmd.CommandText = "SELECT VALUE c FROM pubsEntities.employee AS c WHERE c.fname = @fname"; string fname = "Maria"; cmd.Parameters.AddWithValue("fname", fname); DbDataReader rdr = cmd.ExecuteReader(CommandBehavior.SequentialAccess); while (rdr.Read()) Console.WriteLine("[eSQL] employeeName :{0} - {1}", rdr["fname"], rdr["lname"]); rdr.Close(); cn.Close(); } } }}
なお、RowのコレクションをDbDataReaderでダイレクトに取りたい場合は、SELECT VALUE を使用します。直接 SELECT c としてしまうと、直接データ取得が出来なくなりますのでご注意下さい。その場合は以下のような記述を書くことになります。 cmd.CommandText = "SELECT c FROM pubsEntities.employee AS c WHERE c.fname = @fname"; string fname = "Maria"; cmd.Parameters.AddWithValue("fname", fname); DbDataReader rdr = cmd.ExecuteReader(CommandBehavior.SequentialAccess); while (rdr.Read()) { IExtendedDataRecord xrec = (IExtendedDataRecord)rdr[0]; Console.WriteLine("[eSQL] employeeName :{0} - {1}", xrec["fname"], xrec["lname"]); }
こだかたろう