C# 最有效的尝试/最终/处置
我有一个方法,可以传递DbContext,也可以不传递: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
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();
}
}