需要:允许用户选择 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 的类型初始化程序引发了异常。