从复杂对象请求int时的Dapper默认行为

时间:2017-02-08 14:06:02

标签: c# dapper

最近,我们在代码库中遇到了一个场景,我们使用dapper将复杂对象映射为int。此代码似乎工作并返回Id。 dapper如何从复杂对象解析为简单的基础对象,即它将使用查询或关键字段中返回的第一个值?

[HttpGet]
    [Route("GetIssuesByFlag/{flag:int=3?}")]
    public IEnumerable<IssueDto> GetIssuesByFlag(int flag, List<int> tagIds, int? categoryId = null)

1 个答案:

答案 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 *是有风险的。

无论它如何工作,你都应该改变它。您应明确声明要选择的字段,并且不应选择不需要的字段。如果您只需要从查询中获取单个值,则可以使用QuerySingleExecuteScalar

对于开源项目,当您对它们的工作方式有疑问时,不要害怕实际查看源代码。