表达式树-EF Core动态参数化而不是常量化

时间:2019-04-04 14:41:40

标签: entity-framework linq entity-framework-core expression-trees

对于我们的应用程序,我正在尝试构建一个自动生成的过滤机制。由于我不想一遍又一遍地指定相同的内容,因此我尝试动态构建表达式树,我的代码像这样

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

总而言之-我的问题是,如何通过使用动态生成的表达式树来获得所需的结果?

0 个答案:

没有答案