c# – 组合表达式,而不是在Entity Framework中使用多个查询

我有以下通用可查询(可能已经应用了选择):
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查询参数.

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...