-1

DbContext を渡す場合と渡さない場合があるこのメソッドがあります。

public static List<ClaimService> GetServicesForAccountType(DatabaseContainer db,Guid claimId, Guid accountTypeId)
{
    bool dispose = (db == null ? true :false);
    try
    {
        db = (db ==  null ?  new DatabaseContainer(): db);
        return db.Database.SqlQuery<ClaimService>("SELECT * FROM dbo.ClaimService WHERE ClaimId = '@p1' AND AccountTypeId = '@p2'", new System.Data.SqlClient.SqlParameter("p1", claimId), new System.Data.SqlClient.SqlParameter("p2", accountTypeId)).ToList();
    }
    finally
    {
        if (dispose) { db.Dispose(); }
    }
}

私は 2 つの三項操作を行っています。1 つは廃棄を行う必要があるかどうかを判断するため、もう 1 つは新しい dbContext を作成する必要があるかどうかを判断するためです。

質問: 両方の 3 項演算はまったく同じ条件です。自分と変数を 1 つの演算で(db == null)設定する方法はありますか?disposedb

4

3 に答える 3

2

dispose2番目のチェックで使用できます:

db = (dispose ?  new DatabaseContainer() : db);

または null 合体演算子を使用します。

db = db ?? new DatabaseContainer();
于 2014-03-08T02:56:51.557 に答える
2

最初のステートメントは次のように書き換えることができます

bool dispose = db == null;

そして2番目は

db = db ?? new DatabaseContainer();

この最後のオプションについては、 null 合体演算子を参照してください。

于 2014-03-08T02:56:58.783 に答える
1

あなたがそれを作成した場合は破棄したいようですdbが、渡されたものを使用し、そうでない場合は破棄しないでください。次のようなことができます:

public static List<ClaimService> GetServicesForAccountType(DatabaseContainer db,Guid claimId, Guid accountTypeId)
{
    DatabaseContaner localScopeDbContainer = null;

    try
    {
        db = db ?? (localScopeDbContainer = new DatabaseContainer());
        return db.Database.SqlQuery<ClaimService>("SELECT * FROM dbo.ClaimService WHERE ClaimId = '@p1' AND AccountTypeId = '@p2'", new System.Data.SqlClient.SqlParameter("p1", claimId), new System.Data.SqlClient.SqlParameter("p2", accountTypeId)).ToList();
    }
    finally
    {
        if (localScopeDbContainer != null)
            localScopeDbContainer.Dispose();
    }
}

をスキップしdb =て、ワンライナーを実行することもできます。

public static List<ClaimService> GetServicesForAccountType(DatabaseContainer db,Guid claimId, Guid accountTypeId)
{
    DatabaseContaner localScopeDbContainer = null;

    try
    {
        return (db ?? (localScopeDbContainer = new DatabaseContainer()).Database.SqlQuery<ClaimService>("SELECT * FROM dbo.ClaimService WHERE ClaimId = '@p1' AND AccountTypeId = '@p2'", new System.Data.SqlClient.SqlParameter("p1", claimId), new System.Data.SqlClient.SqlParameter("p2", accountTypeId)).ToList();
    }
    finally
    {
        if (localScopeDbContainer != null)
            localScopeDbContainer.Dispose();
    }
}

しかし、これがどれだけ読みやすくなるかはわかりません。

于 2014-03-08T03:00:30.147 に答える