0

データベーステーブルに対して次の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 を使用しています。関数をインポートしたくありません。

誰か助けてくれませんか?

4

1 に答える 1

2

私たちはフォーラムであなたに答えました: http://forums.devart.com/viewtopic.php?f=3&t=29126

答え:

このコードを変更してください

list = context.Database.SqlQuery<T>("select " + procname + "(" + paranames + ")", param).ToList<T>();

これとともに:

list = context.Database.SqlQuery<T>("select * from " + procname + "(" + paranames + ")", param).ToList<T>();

これは、PostgreSQL ストアド プロシージャの操作の特殊性に関連しています。「select test_proc_ss」の場合、PostgreSQL レコードが返されます。すべての列が返され、EF が対応するオブジェクトを具体化できるように、クエリを公開する必要があります。

于 2014-03-13T07:54:02.910 に答える