C# 动态更改Linq Select
在这段代码中:C# 动态更改Linq Select,c#,linq,asp.net-core,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
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尝试使用列别名:
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));
}
更新:我在所有地方都添加了方括号以使其工作。关键字不仅是保留字,传入的列名也可能是关键字,或者它们可能包含空格/特殊字符。这将使它几乎适用于任何情况,只要列名中没有方括号。很难从dynamic中按名称检索属性,特别是如果它正在实现IDynamicMetaObjectProvider 所以,hack就是使用JSON的序列化,然后通过名称访问它的属性 Return语句应与此处使用的语句类似:
@我想这应该行得通。你会遇到什么错误?请详细说明发生了什么,仅仅说明它不起作用是永远不够的。将SELECT{key}as key更改为SELECT{key}as[key]解决了这个问题:啊,太好了,事后看来这是很明显的,因为key在SQL中是一个保留字。我已经更新了我的答案。
return result.Select(x => {
var jo = (JObject)JToken.FromObject(d);
return new KeyValuePair<int, string>(jo[key], jo[value]);
});