我已经设法在今天作为小沙盒/ POC项目获得了一些东西,但似乎在一个问题上让我头脑发热......
题:
有没有办法让dapper映射到带有空格的SQL列名。
作为我的结果集,我有一些这样的效果。
例如:
SELECT 001 AS [Col 1],
901 AS [Col 2],
00454345345345435349 AS [Col 3],
03453453453454353458 AS [Col 4]
FROM [Some Schema].[Some Table]
我的班级看起来像这样
public class ClassA
{
public string Col1 { get; set; }
public string Col2 { get; set; }
///... etc
}
我的实现目前看起来像这样
public Tuple<IList<TClass>, IList<TClass2>> QueryMultiple<TClass, TClass2>(object parameters)
{
List<TClass> output1;
List<TClass2> output2;
using (var data = this.Connection.QueryMultiple(this.GlobalParameter.RpcProcedureName, parameters, CommandType.StoredProcedure))
{
output1 = data.Read<TClass>().ToList();
output2 = data.Read<TClass2>().ToList();
}
var result = new Tuple<IList<TClass>, IList<TClass2>>(output1, output2);
return result;
}
注意:SQL无法以任何方式进行修改。
目前我正在经历一个短小精悍的代码,我唯一可以预见的解决方案是添加一些代码来“说服”列比较,但到目前为止没有太多运气。
我在StackOverflow上看到有些东西像dapper扩展,但是我希望我可以在不添加扩展的情况下完成这项工作,如果没有的话。我会采取最快捷的方式来实施。
这里的一个选择是通过动态/非泛型API,然后通过每行IDictionary<string,object>
API获取值,但这可能有点乏味。
作为替代方案,您可以创建一个自定义映射器,并告诉dapper它;例如:
SqlMapper.SetTypeMap(typeof(ClassA), new RemoveSpacesMap());
有:
class RemoveSpacesMap : Dapper.SqlMapper.ITypeMap
{
System.Reflection.ConstructorInfo SqlMapper.ITypeMap.FindConstructor(string[] names, Type[] types)
{
return null;
}
SqlMapper.IMemberMap SqlMapper.ITypeMap.GetConstructorParameter(System.Reflection.ConstructorInfo constructor, string columnName)
{
return null;
}
SqlMapper.IMemberMap SqlMapper.ITypeMap.GetMember(string columnName)
{
var prop = typeof(ClassA).GetProperty(columnName.Replace(" ", ""));
return prop == null ? null : new PropertyMemberMap(columnName, prop);
}
class PropertyMemberMap : Dapper.SqlMapper.IMemberMap
{
private string columnName;
private PropertyInfo property;
public PropertyMemberMap(string columnName, PropertyInfo property)
{
this.columnName = columnName;
this.property = property;
}
string SqlMapper.IMemberMap.ColumnName
{
get { throw new NotImplementedException(); }
}
System.Reflection.FieldInfo SqlMapper.IMemberMap.Field
{
get { return null; }
}
Type SqlMapper.IMemberMap.MemberType
{
get { return property.PropertyType; }
}
System.Reflection.ParameterInfo SqlMapper.IMemberMap.Parameter
{
get { return null; }
}
System.Reflection.PropertyInfo SqlMapper.IMemberMap.Property
{
get { return property; }
}
}
}
有一个nuget包Dapper.FluentMap ,允许您添加列名映射(包括空格)。它与EntityFramework类似。
// Entity class.
public class Customer
{
public string Name { get; set; }
}
// Mapper class.
public class CustomerMapper : EntityMap<Customer>
{
public CustomerMapper()
{
Map(p => p.Name).ToColumn("Customer Name");
}
}
// Initialise like so -
FluentMapper.Initialize(a => a.AddMap(new CustomerMapper()));
有关更多信息,请参阅https://github.com/henkmollema/Dapper-FluentMap 。