using 语句中的可选上下文参数
Optional context parameter in using statement
我有这个方法
public static List<_Account> Get(_User user, string name = null, SearchType sName = SearchType.Equals)
{
using (Context context = new Context())
{
IQueryable<_Account> query = context.Accounts;
if (!string.IsNullOrEmpty(name) && sName == SearchType.Equals)
query = query.Where(r => r.Name.Equals(name));
if (!string.IsNullOrEmpty(name) && sName == SearchType.StartsWith)
query = query.Where(r => r.Name.StartsWith(name));
if (!string.IsNullOrEmpty(name) && sName == SearchType.Contains)
query = query.Where(r => r.Name.Contains(name));
return query.ToList();
}
}
这行得通,但是当我从另一个我已经定义了上下文的方法调用此方法时,我想重用该上下文。我会添加一个可选参数
public static List<_Account> Get(..., Context ctx = null) {...
如果 ctx != null
我希望使用该上下文 而不是在最后处理 。否则我希望在使用中创建的上下文在方法结束时被使用和处理。
您可以将 null 放入 using 块中,因此可以执行以下操作:
public static List<_Account> Get(_User user, Context contextProvided = null, string name = null, SearchType sName = SearchType.Equals)
{
using (Context contextInner = (contextProvided == null ? new Context() : null)) //magic here
{
Context context = contextProvided ?? contextInner; //magic here
IQueryable<_Account> query = context.Accounts;
if (!string.IsNullOrEmpty(name) && sName == SearchType.Equals)
query = query.Where(r => r.Name.Equals(name));
if (!string.IsNullOrEmpty(name) && sName == SearchType.StartsWith)
query = query.Where(r => r.Name.StartsWith(name));
if (!string.IsNullOrEmpty(name) && sName == SearchType.Contains)
query = query.Where(r => r.Name.Contains(name));
return query.ToList();
}
}
另一个好方法是将方法(查询)的内容提取到辅助方法中。然后,您可以将现在的外部方法复制到两个重载中。一个重载创建上下文,其中一个将其作为参数。
如果这种模式经常发生,您可以通过创建自定义 IDisposable
派生 class:
来实现类似的效果
public static List<_Account> Get(_User user, Context contextProvided = null, ...)
{
using (var contextProvider = new ContextProvider(contextProvided))
{
Context context = contextProvider.EffectiveContext;
//...
}
}
我有这个方法
public static List<_Account> Get(_User user, string name = null, SearchType sName = SearchType.Equals)
{
using (Context context = new Context())
{
IQueryable<_Account> query = context.Accounts;
if (!string.IsNullOrEmpty(name) && sName == SearchType.Equals)
query = query.Where(r => r.Name.Equals(name));
if (!string.IsNullOrEmpty(name) && sName == SearchType.StartsWith)
query = query.Where(r => r.Name.StartsWith(name));
if (!string.IsNullOrEmpty(name) && sName == SearchType.Contains)
query = query.Where(r => r.Name.Contains(name));
return query.ToList();
}
}
这行得通,但是当我从另一个我已经定义了上下文的方法调用此方法时,我想重用该上下文。我会添加一个可选参数
public static List<_Account> Get(..., Context ctx = null) {...
如果 ctx != null
我希望使用该上下文 而不是在最后处理 。否则我希望在使用中创建的上下文在方法结束时被使用和处理。
您可以将 null 放入 using 块中,因此可以执行以下操作:
public static List<_Account> Get(_User user, Context contextProvided = null, string name = null, SearchType sName = SearchType.Equals)
{
using (Context contextInner = (contextProvided == null ? new Context() : null)) //magic here
{
Context context = contextProvided ?? contextInner; //magic here
IQueryable<_Account> query = context.Accounts;
if (!string.IsNullOrEmpty(name) && sName == SearchType.Equals)
query = query.Where(r => r.Name.Equals(name));
if (!string.IsNullOrEmpty(name) && sName == SearchType.StartsWith)
query = query.Where(r => r.Name.StartsWith(name));
if (!string.IsNullOrEmpty(name) && sName == SearchType.Contains)
query = query.Where(r => r.Name.Contains(name));
return query.ToList();
}
}
另一个好方法是将方法(查询)的内容提取到辅助方法中。然后,您可以将现在的外部方法复制到两个重载中。一个重载创建上下文,其中一个将其作为参数。
如果这种模式经常发生,您可以通过创建自定义 IDisposable
派生 class:
public static List<_Account> Get(_User user, Context contextProvided = null, ...)
{
using (var contextProvider = new ContextProvider(contextProvided))
{
Context context = contextProvider.EffectiveContext;
//...
}
}