我目前正忙着使用LINQKit
构建动态查询。
对于我的特定实体User
,我定义了以下属性:
public static Expression<Func<User, MyEntites, int>> CountFromView => (user, ctx) => ctx.vwUserStats.Select(s => s.Count).FirstOrDefault();
我通常会使用像Select(u => new {Count = User.CountFromView.Invoke(u, ctx)}
这样的linq,它完全可以找到。
但是,构建查询比我在此处写下来更复杂。
我有一个静态帮助器,它根据给定的配置构建查询(指示应该从数据库中选择/查询的内容和方式)。
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()
}