データベーステーブルに対して次のPOCOクラスがあります
public class Contact
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
public bool Checked { get; set; }
public string Mobile { get; set; }
public string Email { get; set; }
}
PostgreSQL データベースの関数
CREATE OR REPLACE FUNCTION test_proc_pg()
RETURNS TABLE(id integer, name character varying, Checked boolean, Mobile character varying, Email character varying) AS
$BODY$
BEGIN
RETURN QUERY select temp1.id, temp1.Name, temp1.Checked, temp1.Mobile, temp1.Email from temp1;
END;
$BODY$
LANGUAGE plpgsql VOLATILE;
PostgreSQL 関数を呼び出してデータを取得する汎用関数を定義
public static List<T> ExecuteProc<T>(string procname, params PgSqlParameter[] param)
{
List<T> list;
string paranames = string.Empty;
foreach (PgSqlParameter p in param)
{
if (paranames != string.Empty)
paranames += ", ";
paranames = paranames + "?";
}
using (var context = new EntityContext())
{
list = context.Database.SqlQuery<T>("select " + procname + "(" + paranames + ")", param).ToList<T>();
}
return list;
}
コントローラーで上記の関数を呼び出す
public ActionResult ProcTest()
{
List<Contact> contacts = DAL.ExecuteProc<Contact>("test_proc_pg");
return View(contacts);
}
関数は実行されて返さList<Contact>
れますが、クラス内のすべてのフィールドはnull
.
{TestPG.Models.Contact}
Checked: false
Email: null
Id: 0
Mobile: null
Name: null
ただし、SQL Server/SqlClient を使用して proc を同様に呼び出すと、すべてのフィールドにデータが入力されます。これは、SQL Server 用に作成された同様の関数です。
public static List<T> ExecuteProc<T>(string procname, params SqlParameter[] param)
{
List<T> list;
string paranames = string.Empty;
foreach (SqlParameter p in param)
{
if (paranames != string.Empty)
paranames += ", ";
paranames = paranames + "@" + p.ParameterName;
}
using (var context = new SSContext())
{
list = context.Database.SqlQuery<T>("exec " + procname + " " + paranames, param).ToList<T>();
}
return list;
}
コントローラーから呼び出すと、すべてのフィールドが入力されたクラスが提供されます
public ActionResult ProcTest()
{
List<Contact> contacts = DAL.ExecuteProc<Contact>("test_proc_ss");
return View(contacts);
}
これはSQL Serverの結果です
{TestSS.Models.Contact}
Checked: false
Email: "noone@nowhere.com"
Id: 1
Mobile: "1234567890"
Name: "samtech"
dotConnect PostgreSQL で何が間違っているのでしょうか?
dotConnect for PostgreSQL の最新の試用版で EF6 を使用しています。関数をインポートしたくありません。
誰か助けてくれませんか?