对于我们的应用程序,我正在尝试构建一个自动生成的过滤机制。由于我不想一遍又一遍地指定相同的内容,因此我尝试动态构建表达式树,我的代码像这样
var db = svc.Context;
var desiredId = 14959;
var itemProp = typeof(TicketNumber).GetProperty(nameof(TicketNumber.TicketID));
var expParam = Expression.Parameter(typeof(TicketNumber), itemProp.Name);
var expBody = Expression.Equal(Expression.PropertyOrField(expParam, itemProp.Name), Expression.Constant(desiredId, itemProp.PropertyType));
var whereLambda = Expression.Lambda<Func<TicketNumber, bool>>(expBody, expParam);
var finalQuery = db.TicketNumbers.Where(whereLambda).Select(p => p.Id);
var finalData = await finalQuery.ToListAsync();
此确实有效,但是它会在SQL查询之后输出
SELECT [TicketID].[Id]
FROM [TicketNumber] AS [TicketID]
WHERE [TicketID].[TicketID] = 14959
这里的问题是查询未参数化,而是具有硬性常数值。我认为这对于EF Core的内部查询缓存不是最佳选择,我想要实现的功能与以标准方式调用查询时收到的内容类似
var finalQuery = db.TicketNumbers.Where(p => p.TicketID == desiredId).Select(p => p.Id);
这将输出所需的SQL查询
SELECT [p].[Id]
FROM [TicketNumber] AS [p]
WHERE [p].[TicketID] = @__desiredId_0
总而言之-我的问题是,如何通过使用动态生成的表达式树来获得所需的结果?