Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 动态更改Linq Select_C#_Linq_Asp.net Core - Fatal编程技术网

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