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; }
}
正確:發行約短小精悍
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一個例外:
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會拋出一個異常。
這是設計問題,或者我使用不正確?
我編輯的問題already.You可以看看問題又來。 –
你不應該把splitOn設置爲「Phone」,你可以將它設置爲「Name」。如果我們只需要Profile的Name,你將會看到一個異常。 –
@空葫蘆看到我最近的編輯 –