0

需要:允许用户选择 3 列从本地数据库返回。在另一篇文章的帮助下,我能够为程序中的不同应用程序返回 1 列,我想我可以在这里应用相同的过程,但我没有看到如何允许用户在同一个中选择多个列询问。我看到 whereFunc<>最多接受 17 个重载,其中除了一个之外的所有重载都可以是字段,但这似乎不是正确的方法。

例子:

TableX 具有以下列:A、B、C、D、E、F

A B C D E F
1 2 6 2 4 6
3 6 2 7 2 1
4 8 0 3 7 6

用户选择 A、D、F 列

查询应返回:

1 2 6
3 7 1
4 3 6

实现此目的的 SQL 语句如下:

col1 = user selection 1.SelectedItem.ToString();
col2 = user selection 2.SelectedItem.ToString();
col3 = user selection 3.SelectedItem.ToString();


SELECT @col1, @ col2, @col3 FROM TableX;

如果我知道在运行前将要选择的字段,Linq 语句将类似于以下内容:

(from UserPageTbl in conn.Table<TableX>()
                         select new
                         {
                             TableX.A,
                             TableX.B,
                             TableX.C,
                         }

                       ).ToList();

*但我看不到如何参数化选择LINQ并将它们作为选择语句中的字段传递。

我得到了使用表达式树堆叠 Linq 表达式部分以返回 1 列(如一个ORDERBY和一个WHERE子句)的概念,但我不知道如何为多个列执行此操作。它的工作方式与构建 SQL 语句的方式相同。我试图使用Expression.New我需要new {}生成返回列列表的想法,这似乎不是正确的过程。

当前设置:使用带有表达式树和 lambda 表达式的扩展方法LINQ返回 1 列。这确实有效。请参阅下面的代码:

private static IQueryable<TResult> SelectByFieldName<T, TResult>(IQueryable<T> query, string fieldName)
{
    var param = Expression.Parameter(typeof(T), "e");
    Expression body = Expression.PropertyOrField(param, fieldName);
    if (body.Type != typeof(TResult))
        body = Expression.Convert(body, typeof(TResult));
    var lambda = Expression.Lambda<Func<T, TResult>>(body, param);
    return query.Select(lambda);

}

问题:我无法弄清楚如何向 lambda 表达式添加额外的列以返回多个选定的列。

尝试组合上述 Select Query lambda 表达式中的项目:

    private static IQueryable<TResult> GraphFields<T, a, b, c, TResult>(IQueryable<T> query, string aField, string bField, string cField)
    {
        var param = Expression.Parameter(typeof(T), "e");
        Expression aFieldBody = Expression.PropertyOrField(param, aField);
        if (aFieldBody.Type != typeof(TResult))
            aFieldBody = Expression.Convert(aFieldBody, typeof(TResult));
        Expression bFieldBody = Expression.PropertyOrField(param, bField);
        if (bFieldBody.Type != typeof(TResult))
            bFieldBody = Expression.Convert(bFieldBody, typeof(TResult));
        Expression cFieldBody = Expression.PropertyOrField(param, cField);
        if (cFieldBody.Type != typeof(TResult))
            cFieldBody = Expression.Convert(cFieldBody, typeof(TResult));
        
        var lambdaA = Expression.Lambda<Func<T, TResult>>(aFieldBody, param);
        var lambdaB = Expression.Lambda<Func<T, TResult>>(bFieldBody, param);
        var lambdaC = Expression.Lambda<Func<T, TResult>>(cFieldBody, param);

        return query.Select(lambdaA, lambdaB, lambdaC);


    }

我还尝试使用“Select”语句中的字段变量编写以下内容,

return query.Select(new { aFieldBody, bFieldBody, cFieldBody }, param);

我尝试了以下方法,因为我认为多个重载可以让我

var lambda = Expression.Lambda<Func<T,a,b, TResult>>(aFieldBody, bFieldBody, cFieldBody, param);

我还研究了将它添加到 PropertyOrField 但它只接受两个重载,一个用于参数表达式,1 个用于字段名称。我只是不知道如何附加更多的列。

通过执行以下操作尝试使用 Linq.Dynamic.Core:

var list = conn.Table<Table1>()
        .Where(t => t.User_ID == user).Distinct().ToList();

var listquery = list.AsQueryable();
        var Values = listquery
                .Select("new {Field1}")
                .ToDynamicList();

我收到以下异常: System.TypeInitializationException throw System.Linq.Dynamic.Core.Parser.EnumerationsFromMscorlib 的类型初始化程序引发了异常。

4

0 回答 0