public class Profile
{
public int ID { get; set; }
public string Name { get; set; }
public string Phone { get; set; }
public string Address { get; set; }
public ExtraInfo Extra { get; set; }
}
public class Topic
{
public int ID { get; set; }
public string Title { get; set; }
public DateTime CreateDate { get; set; }
public string Content { get; set; }
public int UID { get; set; }
public int TestColum { get; set; }
public string Name { get; set; }
public Profile Author { get; set; }
public Attachment Attach { get; set; }
}
正确:</p>
var list = conn.Query<Topic, Profile, Topic>(
@"select top 3
T.ID,
T.Title,
T.CreateDate,
P.Phone,
P.Name
from Topic as T
inner join Profile P on T.UID = P.ID",
(T, P) => { T.Author = P; return T; },
null,
null,
true,
"Phone");
在 SqlMapper.cs 第 2177 行抛出异常:</p>
var list = conn.Query<Topic, Profile, Topic>(
@"select top 3
T.ID,
T.Title,
T.CreateDate,
P.Name,
P.Phone
from Topic as T
inner join Profile P on T.UID = P.ID",
(T, P) => { T.Author = P; return T; },
null,
null,
true,
"Name");
现在,我删除了主题的属性“名称”,这将是正确的。
我认为关键在 SqlMapper.cs 第 1153 行
int current = 0;
var splits = splitOn.Split(',').ToArray();
var splitIndex = 0;
Func<Type, int> nextSplit = type =>
{
var currentSplit = splits[splitIndex].Trim();
if (splits.Length > splitIndex + 1)
{
splitIndex++;
}
bool skipFirst = false;
int startingPos = current + 1;
// if our current type has the split, skip the first time you see it.
if (type != typeof(Object))
{
var props = DefaultTypeMap.GetSettableProps(type);
var fields = DefaultTypeMap.GetSettableFields(type);
foreach (var name in props.Select(p => p.Name).Concat(fields.Select(f => f.Name)))
{
if (string.Equals(name, currentSplit, StringComparison.OrdinalIgnoreCase))
{
skipFirst = true;
startingPos = current;
break;
}
}
}
int pos;
for (pos = startingPos; pos < reader.FieldCount; pos++)
{
// some people like ID some id ... assuming case insensitive splits for now
if (splitOn == "*")
{
break;
}
if (string.Equals(reader.GetName(pos), currentSplit, StringComparison.OrdinalIgnoreCase))
{
if (skipFirst)
{
skipFirst = false;
}
else
{
break;
}
}
}
current = pos;
return pos;
};
“如果我们目前的类型有拆分,第一次看到就跳过。”
当“当前类型”有一个名称等于“split”的属性,但我们没有从db中选择这个字段时,dapper会抛出异常。
这是设计问题,还是我没有正确使用?