我目前正在努力使用LINQKit
.
对于我的特定实体User
,我定义了以下属性:
public static Expression<Func<User, MyEntites, int>> CountFromView => (user, ctx) => ctx.vwUserStats.Select(s => s.Count).FirstOrDefault();
这我通常会在 linq 中使用,就像Select(u => new {Count = User.CountFromView.Invoke(u, ctx)}
完全可以找到的那样。然而,构建查询比我在这里写的要复杂。
我有一个静态助手,它根据给定的配置构建查询(指示应该从数据库中选择/查询什么以及如何查询)。
var selectType = typeof(UserstatsSelect);
var theEntity = Expression.Parameter(typeof(User));
if (cfg.Select(nameof(UserstatsSelect.Count)))
memberBindings.Add(Expression.Bind(selectType.GetProperty(nameof(Count)), Expression.Invoke(User.EventCountFromView, theEntity, ContextParameter)));
而ContextParameter
在基类中定义如下:
protected static ParameterExpression ContextParameter => Expression.Parameter(typeof(MyEntites), "context");
当我运行应用程序并让我显示它显示的查询时
(context, Param_0) => new OrganizerStatisticsResourceSelect() {
EventCount = Invoke((user, ctx) => ctx.vwUserStats.Select(s => s.Count).FirstOrDefault(), Param_0, context)
}
这似乎完全没问题。不幸的是我得到了例外
参数“context”未绑定在指定的 LINQ to Entities 查询表达式中
我不知道为什么会发生这种情况,因为我还有其他这样的属性,我ContextParameter
以同样的方式传递给它。注意:我Count()
在这里调用结果集。
(context, Param_0) => new OrganizerStatisticsResourceSelect() {
AdvancedCount = Invoke((user, dbContext) => dbContext.fnGetSomeData(Convert(user.Id)), Param_0, context).AsQueryable()).Count()
}