【发布时间】:2015-07-14 06:42:54
【问题描述】:
- EF 6,.NET 4.51
我正在尝试构建一个通用帮助器类,它将帮助我将每个结果集“翻译”成一个类型安全的类,如此处所述Handle multiple result from a stored procedure with SqlQuery
对于我的解决方案,我想将以下内容传递给我的助手类 (MultiResultsetsHelper):
- 通用返回类型
- 对象上下文
- 数据读取器
- 类类型列表按返回结果集的顺序返回
然后让助手类完成填充 1 的繁重工作。以下是目前的代码:
结果类
public class Set1ReturnDto
{
public int CruiseCount { get; set; }
public string DisplayText { get; set; }
public int DisplayValue { get; set; }
}
public class Set2ReturnDto
{
public string DepartingFrom { get; set; }
public string Port_Code { get; set; }
}
public class DummyReturnDto
{
public DummyReturnDto()
{
Set1 = new List<Set1ReturnDto>();
Set2 = new List<Set2ReturnDto>();
}
public List<Set1ReturnDto> Set1 { get; set; }
public List<Set2ReturnDto> Set2 { get; set; }
}
低级数据库调用
public static DummyReturnDto DonoUspGetSideBarList(DbContext aDbContext, out int aProcResult)
{
SqlParameter procResultParam = new SqlParameter { ParameterName = "@procResult", SqlDbType = SqlDbType.Int, Direction = ParameterDirection.Output };
DbCommand dbCommand = aDbContext.Database.Connection.CreateCommand();
dbCommand.Parameters.Add(procResultParam);
dbCommand.CommandText = "EXEC @procResult = [dbo].[usp_GetSideBarList] ";
dbCommand.Transaction = aDbContext.Database.CurrentTransaction.UnderlyingTransaction;
DbDataReader reader = dbCommand.ExecuteReader();
aProcResult = -1;
// Drop down to the wrapped `ObjectContext` to get access to the `Translate` method
ObjectContext objectContext = ((IObjectContextAdapter)aDbContext).ObjectContext;
List<Type> containedDtos = new List<Type>
{
typeof (List<Set1ReturnDto>),
typeof (List<Set1ReturnDto>)
};
return MultiResultsetsHelper.Process<DummyReturnDto>(reader, objectContext, containedDtos);
}
返回的结果数据集是:
助手类
public static class MultiResultsetsHelper
{
/// <summary>
/// Given a data reader that contains multiple result sets, use the supplied object context to serialise the
/// rows of data in the result set into our property.
/// </summary>
/// <typeparam name="T">Type of the containing object that contains all the various result sets.</typeparam>
/// <param name="aDbReader">Database reader that contains all the result sets returned from the database.</param>
/// <param name="aObjectContext">Data context associated with the data reader.</param>
/// <param name="aContainedDataSetReturnedTypes">
/// List of types in order of which the result sets are contained within the
/// data reader. We will serilize sequentially each result set the data reader contains
/// </param>
/// <returns>Retuns an object representing all the result sets returned by the data reader.</returns>
public static T Process<T>(DbDataReader aDbReader, ObjectContext aObjectContext, List<Type> aContainedDataSetReturnedTypes) where T : new()
{
//What we will be returning
T result = new T();
for (int datasetNdx = 0; datasetNdx < aContainedDataSetReturnedTypes.Count; datasetNdx++)
{
//Advance the reader if we are not looking at the first dataset
if (datasetNdx != 0)
aDbReader.NextResult();
//Get the property we are going to be updating based on the type of the class we will be filling
PropertyInfo propertyInfo = typeof (T).GetProperties().Single(p => p.PropertyType == aContainedDataSetReturnedTypes[datasetNdx]);
//Now get the object context to deserialize what is in the resultset into our type
var valueForProperty = aObjectContext.Translate <aContainedDataSetReturnedTypes[datasetNdx]> (aDbReader);
//Finally we update the property with the type safe information
propertyInfo.SetValue(result, valueForProperty, null);
}
return result;
}
}
但是目前我无法编译它。
错误 2 运算符“
有人可以帮忙吗?归根结底,它与我们如何使用反射和传入的 aContainedDataSetReturnedTypes 有关。只要调用 MultiResultsetsHelper.Process()
仍然很容易,我很乐意进行更改【问题讨论】:
-
EXEC @procResult = [dbo].[usp_GetSideBarList]返回什么实体类型? -
它返回两个数据集。第一个具有根据 Set1ReturnDto 的字段,第二个具有根据 Set2ReturnDto 的字段
-
我会将两个
POCO类组合在一起以创建另一个代表结果集的类,然后使用context.Database.SqlQuery<JoinedPocoClass>("stored proc")然后在其上使用Select以投影到单独的POCO类中 -
除非你可以触发
sproc两次以给出两个不同的结果集,然后我会触发SqlQuery强类型与两个POCO类 -
@CallumLinington Ist JoinedPocoClass 实际上是我的班级 DummyReturnDto?
标签: c# entity-framework generics