我在c#中创建了一个带out参数的通用方法。它将返回我通过列表对象的两个out参数值。
public void ExecuteList<T, T1>(out List<T> obj, out List<T1> obj1, string sql, params object[] parameters) where T : class
{
using (var db = _context)
{
var cmd = db.Database.Connection.CreateCommand();
cmd.CommandText = sql;
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddRange(parameters);
try
{
db.Database.Connection.Open();
using (var reder = cmd.ExecuteReader())
{
obj = ((IObjectContextAdapter)db).ObjectContext.Translate<T>(reder).ToList();
reder.NextResult();
obj1 = ((IObjectContextAdapter)db).ObjectContext.Translate<T1>(reder).ToList();
}
}
finally
{
db.Database.Connection.Close();
cmd.Dispose();
}
}
}
调用此方法
List<SqlParameter> parameterList = new List<SqlParameter>();
parameterList.Add(new SqlParameter("@pageNo", 1));
parameterList.Add(new SqlParameter("@pageSize", 5));
SqlParameter[] parameters = parameterList.ToArray();
List<PostModel> PostList = new List<PostModel>();
List<Tag> TagList = new List<Tag>();
Uow.ExecuteList<PostModel,Tag>(out PostList, out TagList, "[dbo].[sp_getdata]", parameters);
这里我传递了postmodel和tag类进行转换,还传递了两个out参数PostList和TagList作为结果。 它将返回完美的结果。 但是我的要求是这些转换类,out参数应该是可选的。 像这样: 当我想要一个结果时,则传递一个转换类和一个Out参数。
List<SqlParameter> parameterList = new List<SqlParameter>();
parameterList.Add(new SqlParameter("@pageNo", 1));
parameterList.Add(new SqlParameter("@pageSize", 5));
SqlParameter[] parameters = parameterList.ToArray();
List<PostModel> PostList = new List<PostModel>();
Uow.ExecuteList<PostModel>(out PostList, "[dbo].[sp_getdata]", parameters);
当我想要两个Result时,则传递两个强制转换类和两个out参数。
List<SqlParameter> parameterList = new List<SqlParameter>();
parameterList.Add(new SqlParameter("@pageNo", 1));
parameterList.Add(new SqlParameter("@pageSize", 5));
SqlParameter[] parameters = parameterList.ToArray();
List<PostModel> PostList = new List<PostModel>();
List<Tag> TagList = new List<Tag>();
Uow.ExecuteList<PostModel,Tag>(out PostList, out TagList, "[dbo].[sp_getdata]", parameters);
请帮助我解决我的问题
答案 0 :(得分:0)
您可以创建多个重载,这些重载将调用相同的私有方法:
private void Execute<T, T1>(ref List<T> obj, ref List<T1> obj1, string sql, params object[] parameters) where T : class
{
using (var db = _context)
{
var cmd = db.Database.Connection.CreateCommand();
cmd.CommandText = sql;
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddRange(parameters);
try
{
db.Database.Connection.Open();
using (var reader = cmd.ExecuteReader())
{
obj = ((IObjectContextAdapter)db).ObjectContext.Translate<T>(reader).ToList();
if(obj1 != null) {
reader.NextResult();
obj1 = ((IObjectContextAdapter)db).ObjectContext.Translate<T1>(reader).ToList();
}
}
}
finally
{
db.Database.Connection.Close();
cmd.Dispose();
}
}
}
public void ExecuteList<T, T1>(out List<T> obj, out List<T1> obj1, string sql, params object[] parameters) where T : class
{
obj = new List<T>();
obj1 = new List<T1>();
Execute(ref obj, ref obj1, sql, parameters);
}
public void ExecuteList<T>(out List<T> obj, string sql, params object[] parameters) where T : class
{
obj = new List<T>();
List<object> stub = null;//generic argument doesn't matter because it will not be used
Execute<T, object>(ref obj, ref stub, sql, parameters);
}
请注意,我的第一个方法是私有方法,仅应从公共重载中调用(可以根据需要添加任意数量的输出参数/重载)。
同样也可以将T1
限制为class
并使用List<SqlParameter>
而不是params object[] parameters
作为最后一个参数。