动态更改Linq Select

时间:2017-10-27 15:56:05

标签: c# linq asp.net-core

在这段代码中:

        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

2 个答案:

答案 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]);
});