提交 33be5b84 编写于 作者: A Adam Schroder

Add exact column name matching which doesn't remove underscores to match column names #351

上级 9079b627
...@@ -9,5 +9,6 @@ public class ColumnAttribute : Attribute ...@@ -9,5 +9,6 @@ public class ColumnAttribute : Attribute
public ColumnAttribute(string name) { Name = name; } public ColumnAttribute(string name) { Name = name; }
public string Name { get; set; } public string Name { get; set; }
public bool ForceToUtc { get; set; } = true; public bool ForceToUtc { get; set; } = true;
public bool ExactNameMatch { get; set; }
} }
} }
\ No newline at end of file
...@@ -25,6 +25,7 @@ public class ColumnInfo ...@@ -25,6 +25,7 @@ public class ColumnInfo
public ReferenceType ReferenceType { get; set; } public ReferenceType ReferenceType { get; set; }
public string ReferenceMemberName { get; set; } public string ReferenceMemberName { get; set; }
public MemberInfo MemberInfo { get; internal set; } public MemberInfo MemberInfo { get; internal set; }
public bool ExactColumnNameMatch { get; set; }
public static ColumnInfo FromMemberInfo(MemberInfo mi) public static ColumnInfo FromMemberInfo(MemberInfo mi)
{ {
...@@ -84,6 +85,7 @@ public static ColumnInfo FromMemberInfo(MemberInfo mi) ...@@ -84,6 +85,7 @@ public static ColumnInfo FromMemberInfo(MemberInfo mi)
{ {
ci.ColumnName = colAttrs.FirstOrDefault(x => !string.IsNullOrEmpty(x.Name))?.Name ?? mi.Name; ci.ColumnName = colAttrs.FirstOrDefault(x => !string.IsNullOrEmpty(x.Name))?.Name ?? mi.Name;
ci.ForceToUtc = colAttrs.All(x => x.ForceToUtc); ci.ForceToUtc = colAttrs.All(x => x.ForceToUtc);
ci.ExactColumnNameMatch = colAttrs.All(x => x.ExactNameMatch);
var resultAttr = colAttrs.OfType<ResultColumnAttribute>().FirstOrDefault(); var resultAttr = colAttrs.OfType<ResultColumnAttribute>().FirstOrDefault();
ci.ResultColumn = resultAttr != null; ci.ResultColumn = resultAttr != null;
......
...@@ -101,6 +101,7 @@ public IManyColumnBuilder<TModel> Reference(Expression<Func<TModel, object>> mem ...@@ -101,6 +101,7 @@ public IManyColumnBuilder<TModel> Reference(Expression<Func<TModel, object>> mem
public interface IColumnBuilder<TModel> public interface IColumnBuilder<TModel>
{ {
IColumnBuilder<TModel> WithName(string name); IColumnBuilder<TModel> WithName(string name);
IColumnBuilder<TModel> WithName(string name, bool exactMatch);
IColumnBuilder<TModel> WithAlias(string alias); IColumnBuilder<TModel> WithAlias(string alias);
IColumnBuilder<TModel> WithDbType(Type type); IColumnBuilder<TModel> WithDbType(Type type);
IColumnBuilder<TModel> WithDbType<T>(); IColumnBuilder<TModel> WithDbType<T>();
...@@ -134,6 +135,13 @@ public IColumnBuilder<TModel> WithName(string name) ...@@ -134,6 +135,13 @@ public IColumnBuilder<TModel> WithName(string name)
return this; return this;
} }
public IColumnBuilder<TModel> WithName(string name, bool exactMatch)
{
_columnDefinition.DbColumnName = name;
_columnDefinition.ExactColumnNameMatch = exactMatch;
return this;
}
public IColumnBuilder<TModel> WithAlias(string alias) public IColumnBuilder<TModel> WithAlias(string alias)
{ {
_columnDefinition.DbColumnAlias = alias; _columnDefinition.DbColumnAlias = alias;
......
...@@ -25,5 +25,6 @@ public class ColumnDefinition ...@@ -25,5 +25,6 @@ public class ColumnDefinition
public string ComplexPrefix { get; set; } public string ComplexPrefix { get; set; }
public bool? ValueObjectColumn { get; set; } public bool? ValueObjectColumn { get; set; }
public string ValueObjectColumnName { get; set; } public string ValueObjectColumnName { get; set; }
public bool? ExactColumnNameMatch { get; set; }
} }
} }
\ No newline at end of file
...@@ -277,6 +277,7 @@ private static void MergeOverrides(Dictionary<Type, TypeDefinition> config, Mapp ...@@ -277,6 +277,7 @@ private static void MergeOverrides(Dictionary<Type, TypeDefinition> config, Mapp
convColDefinition.IsComplexMapping = overrideColumnDefinition.Value.IsComplexMapping ?? convColDefinition.IsComplexMapping; convColDefinition.IsComplexMapping = overrideColumnDefinition.Value.IsComplexMapping ?? convColDefinition.IsComplexMapping;
convColDefinition.ValueObjectColumn = overrideColumnDefinition.Value.ValueObjectColumn ?? convColDefinition.ValueObjectColumn; convColDefinition.ValueObjectColumn = overrideColumnDefinition.Value.ValueObjectColumn ?? convColDefinition.ValueObjectColumn;
convColDefinition.ValueObjectColumnName = overrideColumnDefinition.Value.ValueObjectColumnName ?? convColDefinition.ValueObjectColumnName; convColDefinition.ValueObjectColumnName = overrideColumnDefinition.Value.ValueObjectColumnName ?? convColDefinition.ValueObjectColumnName;
convColDefinition.ExactColumnNameMatch = overrideColumnDefinition.Value.ExactColumnNameMatch ?? convColDefinition.ExactColumnNameMatch;
} }
} }
} }
......
...@@ -121,6 +121,7 @@ protected override ColumnInfo GetColumnInfo(MemberInfo mi, Type type) ...@@ -121,6 +121,7 @@ protected override ColumnInfo GetColumnInfo(MemberInfo mi, Type type)
{ {
var colattr = typeConfig.ColumnConfiguration[key]; var colattr = typeConfig.ColumnConfiguration[key];
columnInfo.ColumnName = colattr.DbColumnName; columnInfo.ColumnName = colattr.DbColumnName;
columnInfo.ExactColumnNameMatch = colattr.ExactColumnNameMatch ?? false;
columnInfo.ColumnAlias = colattr.DbColumnAlias; columnInfo.ColumnAlias = colattr.DbColumnAlias;
if (colattr.ResultColumn.HasValue && colattr.ResultColumn.Value) if (colattr.ResultColumn.HasValue && colattr.ResultColumn.Value)
{ {
......
...@@ -53,6 +53,7 @@ public Type ColumnType ...@@ -53,6 +53,7 @@ public Type ColumnType
public bool SerializedColumn { get; set; } public bool SerializedColumn { get; set; }
public bool ValueObjectColumn { get; set; } public bool ValueObjectColumn { get; set; }
public string ValueObjectColumnName { get; set; } public string ValueObjectColumnName { get; set; }
public bool ExactColumnNameMatch { get; set; }
internal void SetMemberAccessors(List<MemberAccessor> memberAccessors) internal void SetMemberAccessors(List<MemberAccessor> memberAccessors)
{ {
......
...@@ -187,6 +187,7 @@ public IEnumerable<PocoMemberPlan> GetPocoMembers(ColumnInfo[] columnInfos, List ...@@ -187,6 +187,7 @@ public IEnumerable<PocoMemberPlan> GetPocoMembers(ColumnInfo[] columnInfos, List
MemberInfoChain = members, MemberInfoChain = members,
ColumnName = columnName, ColumnName = columnName,
ResultColumn = capturedColumnInfo.ResultColumn, ResultColumn = capturedColumnInfo.ResultColumn,
ExactColumnNameMatch = capturedColumnInfo.ExactColumnNameMatch,
ForceToUtc = capturedColumnInfo.ForceToUtc, ForceToUtc = capturedColumnInfo.ForceToUtc,
ComputedColumn = capturedColumnInfo.ComputedColumn, ComputedColumn = capturedColumnInfo.ComputedColumn,
ComputedColumnType = capturedColumnInfo.ComputedColumnType, ComputedColumnType = capturedColumnInfo.ComputedColumnType,
......
...@@ -74,7 +74,7 @@ private MapPlan BuildMapPlan(DbDataReader dataReader, PocoData pocoData) ...@@ -74,7 +74,7 @@ private MapPlan BuildMapPlan(DbDataReader dataReader, PocoData pocoData)
private IEnumerable<MapPlan> BuildMapPlans(GroupResult<PosName> groupedName, DbDataReader dataReader, PocoData pocoData, List<PocoMember> pocoMembers) private IEnumerable<MapPlan> BuildMapPlans(GroupResult<PosName> groupedName, DbDataReader dataReader, PocoData pocoData, List<PocoMember> pocoMembers)
{ {
// find pocomember by property name // find pocomember by property name
var pocoMember = pocoMembers.FirstOrDefault(x => IsEqual(groupedName.Item, x.Name) var pocoMember = pocoMembers.FirstOrDefault(x => IsEqual(groupedName.Item, x.Name, x.PocoColumn?.ExactColumnNameMatch ?? false)
|| string.Equals(groupedName.Item, x.PocoColumn?.ColumnAlias, StringComparison.OrdinalIgnoreCase)); || string.Equals(groupedName.Item, x.PocoColumn?.ColumnAlias, StringComparison.OrdinalIgnoreCase));
if (pocoMember == null) if (pocoMember == null)
...@@ -128,13 +128,13 @@ private IEnumerable<MapPlan> BuildMapPlans(GroupResult<PosName> groupedName, DbD ...@@ -128,13 +128,13 @@ private IEnumerable<MapPlan> BuildMapPlans(GroupResult<PosName> groupedName, DbD
} }
} }
public static bool IsEqual(string name, string value) public static bool IsEqual(string name, string value, bool exactMatch)
{ {
if (value is null) if (value is null)
return false; return false;
return string.Equals(value, name, StringComparison.OrdinalIgnoreCase) return string.Equals(value, name, StringComparison.OrdinalIgnoreCase)
|| string.Equals(value, name.Replace("_", ""), StringComparison.OrdinalIgnoreCase); || (!exactMatch && string.Equals(value, name.Replace("_", ""), StringComparison.OrdinalIgnoreCase));
} }
private bool MapValue(GroupResult<PosName> posName, object[] values, Func<object, object> converter, object instance, PocoColumn pocoColumn, object defaultValue) private bool MapValue(GroupResult<PosName> posName, object[] values, Func<object, object> converter, object instance, PocoColumn pocoColumn, object defaultValue)
......
...@@ -89,15 +89,15 @@ internal static PocoMember FindMember(IEnumerable<PocoMember> pocoMembers, strin ...@@ -89,15 +89,15 @@ internal static PocoMember FindMember(IEnumerable<PocoMember> pocoMembers, strin
private static bool IsPocoMemberEqual(PocoMember pocoMember, string name) private static bool IsPocoMemberEqual(PocoMember pocoMember, string name)
{ {
if (pocoMember.PocoColumn == null) if (pocoMember.PocoColumn == null)
return PropertyMapper.IsEqual(name, pocoMember.Name); return PropertyMapper.IsEqual(name, pocoMember.Name, false);
if (pocoMember.PocoColumn.MemberInfoKey == name) if (pocoMember.PocoColumn.MemberInfoKey == name)
return true; return true;
if (PropertyMapper.IsEqual(name, pocoMember.PocoColumn.ColumnAlias ?? pocoMember.PocoColumn.ColumnName)) if (PropertyMapper.IsEqual(name, pocoMember.PocoColumn.ColumnAlias ?? pocoMember.PocoColumn.ColumnName, pocoMember.PocoColumn.ExactColumnNameMatch))
return true; return true;
return PropertyMapper.IsEqual(name, pocoMember.Name); return PropertyMapper.IsEqual(name, pocoMember.Name, pocoMember.PocoColumn.ExactColumnNameMatch);
} }
private static IEnumerable<PocoMemberLevel> FlattenPocoMembers(List<PocoMember> pocoMembers, int levelMonitor = 1) private static IEnumerable<PocoMemberLevel> FlattenPocoMembers(List<PocoMember> pocoMembers, int levelMonitor = 1)
......
...@@ -745,6 +745,23 @@ public class Result36 ...@@ -745,6 +745,23 @@ public class Result36
public string GetData() => Data; public string GetData() => Data;
public string GetData1() => Data1; public string GetData1() => Data1;
} }
[Test]
public void ExactMatchTests()
{
var result = Database.Single<ExactMatchTestsDto>("select 'Test' MyColumn, 'Test2' My_Column /*poco_dual*/");
Assert.AreEqual("Test", result.MyColumn);
Assert.AreEqual("Test2", result.My_Column);
}
public class ExactMatchTestsDto
{
[Column(ExactNameMatch = true)]
public string MyColumn { get; set; }
[Column(ExactNameMatch = true)]
public string My_Column { get; set; }
}
} }
public class NoPrimaryKey public class NoPrimaryKey
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册