c# – 组合表达式,而不是在Entity Framework中使用多个查询
发布时间:2020-12-15 06:48:07 所属栏目:百科 来源:网络整理
导读:我有以下通用可查询(可能已经应用了选择): IQueryableTEntity queryable = DBSetTEntity.AsQueryable(); 那么Provider类就是这样的: public class ProviderTEntity{ public ExpressionFuncTEntity,bool Condition { get; set; } [...]} 条件可以按照以下方
我有以下通用可查询(可能已经应用了选择):
IQueryable<TEntity> queryable = DBSet<TEntity>.AsQueryable(); 那么Provider类就是这样的: public class Provider<TEntity> { public Expression<Func<TEntity,bool>> Condition { get; set; } [...] } 条件可以按照以下方式定义: Condition = entity => entity.Id == 3; 现在我想选择所有具有至少由DBSet的一个实体满足的条件的Provider实例: List<Provider> providers = [...]; var matchingProviders = providers.Where(provider => queryable.Any(provider.Condition)) 这个问题:我开始查询列表中的每个Provider实例.我宁愿使用单个查询来实现相同的结果.这个话题特别重要,因为有问题的表现.如何使用单个查询获得相同的结果,并使用Linq语句或表达式树来提高性能? 解决方法
有趣的挑战我唯一看到的方式是动态构建UNION ALL查询:
SELECT TOP 1 0 FROM Table WHERE Condition[0] UNION ALL SELECT TOP 1 1 FROM Table WHERE Condition[1] ... UNION ALL SELECT TOP 1 N-1 FROM Table WHERE Condition[N-1] 然后使用返回的数字作为索引来获取匹配的提供者. 这样的事情 var parameter = Expression.Parameter(typeof(TEntity),"e"); var indexQuery = providers .Select((provider,index) => queryable .Where(provider.Condition) .Take(1) .Select(Expression.Lambda<Func<TEntity,int>>(Expression.Constant(index),parameter))) .Aggregate(Queryable.Concat); var indexes = indexQuery.ToList(); var matchingProviders = indexes.Select(index => providers[index]); 请注意,我可以通过替换上述Select来构建查询而不使用Expression类 .Select(_ => index) 但是会为每个索引引入不必要的SQL查询参数. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |