在这段代码中:
protected async Task<IEnumerable<KeyValuePair<int, string>>> GetListAsync(string tableName, string key, string value, string orderBy = "Id")
{
var query = $"SELECT {value},{key} FROM {tableName} ORDER BY {orderBy}";
var result = await QueryAsync<dynamic>(query);
return result.Select(x => new KeyValuePair<int, string>(x.Id, x.RoleName));
}
我试图创建一个动态泛型方法来处理我的任何表的列表 问题是我无法识别如何发送键和值重载而不是x.Id,x.RoleName
答案 0 :(得分:1)
尝试使用列别名:
protected async Task<IEnumerable<KeyValuePair<int, string>>> GetListAsync(string tableName, string key, string value, string orderBy = "Id")
{
var query = $"SELECT [{key}] as [KEY] , [{value}] as [VALUE] FROM [{tableName}] ORDER BY [{orderBy}]";
var result = await QueryAsync<dynamic>(query);
return result.Select(x => new KeyValuePair<int, string>(x.KEY, x.VALUE));
}
更新:我在任何地方都添加了方括号以使其正常工作。 KEY不仅是一个保留字,传入的列名也可能是关键字,或者它们可以包含空格/特殊字符。这将使它适用于几乎所有情况(只要你没有方括号在列名称内)。
答案 1 :(得分:0)
很难从动态中按名称检索属性,尤其是在实施 IDynamicMetaObjectProvider
的情况下所以,hack是使用序列化到JSON,然后按名称访问它的属性。
返回语句应如下所示(此处使用Newtonsoft JSON):
return result.Select(x => {
var jo = (JObject)JToken.FromObject(d);
return new KeyValuePair<int, string>(jo[key], jo[value]);
});