どのようにデフォルト(T)ではなくDapperクエリからnullを返すのですか?

c# dapper null stored-procedures

質問

私はストアドプロシージャを介していくつかの読み取り専用データベース呼び出しのためにDapperを使用しています。私は1行または何も返しませんクエリを持っている。

私はこのようにDapperを使用しています:

using (var conn = new SqlConnection(ConnectionString))
{
    conn.Open();

    return conn.Query<CaseOfficer>("API.GetCaseOfficer", 
        new { Reference = reference }, 
        commandType: CommandType.StoredProcedure).FirstOrDefault();
}

返されたCaseOfficerオブジェクトは次のようになります。

public class CaseOfficer
{
    public string Title { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
    public string Telephone { get; set; }
}

これは、JSONとしてASP.NET Web APIアプリケーションを介して返されます。

ストアドプロシージャが結果を返すと、次のようになります。

{
    title: "Mr",
    firstName: "Case",
    lastName: "Officer",
    email: "test@example.com",
    telephone: "01234 567890"
}

しかし、何も返さないときは、私は得ます:

{
    title: null,
    firstName: null,
    lastName: null,
    email: null,
    telephone: null
}

デフォルト(CaseOfficer)ではなく、Dapperにnullを返すようにするにはどうすればよいですか(404で確認して対応できます)

受け入れられた回答

SPが行を返さない場合、dapperは行を返しません。最初にチェックするのは、あなたのSPがおそらく空行を返したのでしょうか?すべてのnullの行?それとも0行を返しましたか?

ここで、行が返されなかったと仮定すると、 FirstOrDefault (標準のLINQ-to-Objectsのもの)は、 CaseOfficerclass場合はnullを返し、 CaseOfficerstruct場合はデフォルトのインスタンスを返しnull 。それでは、 CaseOfficerclass確認してください( structなるとは思えません)。

しかし、 FirstOrDefaultを使ってdapperを実行すると、一般的には、 すでにあなたが望むことができます。


人気のある回答

デフォルトのプロパティを設定できます。

例えば:

public class BaseEntity
{
    public BaseEntity()
    {
        if (GetType().IsSubclassOf(typeof(BaseEntity)))
        {
            var properties = GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);

            foreach (var property in properties)
            {
                // Get only string properties
                if (property.PropertyType != typeof (string))
                {
                    continue;
                }

                if (!property.CanWrite || !property.CanRead)
                {
                    continue;
                }

                if (property.GetGetMethod(false) == null)
                {
                    continue;
                }
                if (property.GetSetMethod(false) == null)
                {
                    continue;
                }

                if (string.IsNullOrEmpty((string) property.GetValue(this, null)))
                {
                    property.SetValue(this, string.Empty, null);
                }
            }
        }
    }
}

public class CaseOfficer : BaseEntity
{
    public string Title { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
    public string Telephone { get; set; }
}

さて、CaseOfficerには自動プロパティがあります



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ