C# 最有效的尝试/最终/处置

C# 最有效的尝试/最终/处置,c#,entity-framework,ternary-operator,try-finally,C#,Entity Framework,Ternary Operator,Try Finally,我有一个方法,可以传递DbContext,也可以不传递: public static List<ClaimService> GetServicesForAccountType(DatabaseContainer db,Guid claimId, Guid accountTypeId) { bool dispose = (db == null ? true :false); try { db = (db == null ? new Datab

我有一个方法,可以传递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(); }
    }
}
我正在执行两个三元操作,一个用于确定是否应该执行dispose,另一个用于确定是否需要创建新的dbContext

问题:两个三值运算的条件db==null完全相同,有没有办法在一个运算中设置dispose和db变量?

您可以在第二次检查中使用dispose:

db = (dispose ?  new DatabaseContainer() : db);
或使用空合并运算符:

db = db ?? new DatabaseContainer();

您的第一条语句可以重写为

bool dispose = db == null;
第二个是

db = db ?? new DatabaseContainer();

关于最后一个选项,请参见。

如果您负责创建数据库,则听起来像是要处理它,但使用传递的数据库,如果不是,则不处理。你可以这样做:

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();
    }
}

但我不确定这些内容的可读性有多高。

谢谢大家的选择。我不希望定义另一个var并重用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();
    }
}