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;
};
"現在のタイプに分割がある場合は、最初に表示されたときはスキップしてください。"
「現在のタイプ」に「分割」と等しい名前のプロパティがあるが、db からこのフィールドを選択しなかった場合、dapper は例外をスローします。
これは設計上の問題ですか、それとも正しく使用されていませんか?