最近,我们在代码库中遇到了一个场景,我们使用dapper将复杂对象映射为int。此代码似乎工作并返回Id。 dapper如何从复杂对象解析为简单的基础对象,即它将使用查询或关键字段中返回的第一个值?
[HttpGet]
[Route("GetIssuesByFlag/{flag:int=3?}")]
public IEnumerable<IssueDto> GetIssuesByFlag(int flag, List<int> tagIds, int? categoryId = null)
答案 0 :(得分:1)
来自the code:
/// <summary>
/// Executes a query, returning the data typed as per T
/// </summary>
/// <returns>A sequence of data of the supplied type;
/// if a basic type (int, string, etc) is queried then the data
/// from the first column in assumed, otherwise an instance is
/// created per row, and a direct column-name===member-name mapping
/// is assumed (case insensitive).
/// </returns>
public static IEnumerable<T> Query<T>
所以它只抓住了第一列。这就是为什么使用select *
是有风险的。
无论它如何工作,你都应该改变它。您应明确声明要选择的字段,并且不应选择不需要的字段。如果您只需要从查询中获取单个值,则可以使用QuerySingle
或ExecuteScalar
。
对于开源项目,当您对它们的工作方式有疑问时,不要害怕实际查看源代码。