SelectMany生成的查询太多

本文关键字:查询 太多 SelectMany | 更新日期: 2023-09-27 18:22:51

我在用户组中有动态字段,我想根据用户是什么用户组来选择它们。

基本上,我想模拟像.Where(x => x.UserGroupId == x || ...这样的查询,因为否则它只会进行大约20个查询来获得动态字段。

也许我可以以某种方式将整数数组作为UserGroupId传递,它将用||模拟查询。

这里是我的例子,两个结果输出是相同的,唯一的区别是第一个对数据库有20个查询,第二个只有1个。

public IEnumerable<UserGroup> UserGroups
{
    get
    {
        var db = new MainDataContext();
        return db.UserGroupUsers.Where(x => x.UserId == this.Id).Select(x => x.UserGroup);
    }
}
public IEnumerable<UserDynamicField> DynamicFields
{
    get
    {
        var db = new MainDataContext();
        var fields = this.UserGroups.SelectMany(x => x.UserGroupDynamicFields); // 20+ queries
        var fields2 = db.UserGroupDynamicFields.Where(x =>
            x.UserGroupId == 1 ||
            x.UserGroupId == 2 ||
            x.UserGroupId == 3 ||
            x.UserGroupId == 4 ||
            x.UserGroupId == 5 ||
            x.UserGroupId == 6 ||
            x.UserGroupId == 7 ||
            x.UserGroupId == 8 ||
            x.UserGroupId == 9 ||
            x.UserGroupId == 10); // 1 query, maybe I can somehow pass array of Id's here?
    }
}

SelectMany生成的查询太多

尝试将其转换为IQueryable<T>而不是IEnumerable<T>:

public IQueryable<UserGroup> UserGroups
{
    get
    {
        var db = new MainDataContext();
        return db.UserGroupUsers.Where(x => x.UserId == this.Id)
                                .Select(x => x.UserGroup);
    }
}
public IQueryable<UserDynamicField> DynamicFields
{
    get
    {
        // 1 query
        return this.UserGroups.SelectMany(x => x.UserGroupDynamicFields); 
    }
}

这将允许Linq利用这样一个事实,即在迭代之前,它不必在内存中提取结果集,因此这将被转换为传统的SQL联接。