【发布时间】:2021-02-23 12:44:36
【问题描述】:
我有一个如下的 linq 查询:
var query = _appDbContext.Persons
.Where(p => p.Id == 123)
.Select(lambda)
.ToList();
我使用 lambda 是因为我的 select 语句中有一个变量。拉姆达:
var wantedData = "Adress";
var x = Expression.Parameter(typeof(Person), "x");
var body = Expression.PropertyOrField(x, wantedData);
var lambda = Expression.Lambda<Func<Person, Adress>>(body, x);
查询将返回 id 为 123 的人的地址。假设我希望接收此人的所有订阅,而不是地址。由于 lambda 语句中的“地址”,仅设置 wantedData = "Subscription" 将不起作用。所以我正在寻找一种方法来使用变量来更改 lambda 语句中的“地址”。
我尝试了以下,显然不起作用。
var lambda = Expression.Lambda<Func<Person, wantedData>>(body, x);
有没有办法做到这一点?
【问题讨论】:
-
你为什么不只是这样查询?
var addresses= _appDbContext.Persons.Where(p => p.Id == 123).Select(p => p.Address).ToList(); -
@MarianSimonca 因为我希望我的查询基于变量获取地址或订阅。对于像你这样的查询,我必须为此构建两个查询。
-
但是您可以在具有 Expression 参数的方法中使用此查询。调用该函数时,您基本上传递了您希望通过该查询获得的属性
-
@MarianSimonca 我是使用 linq 查询的新手,所以我可能是错的,但这不是我已经在为 var x 赋值吗?
-
是的,有点类似,但是有点复杂,我想举个例子让你试试