我在用户组中有动态字段,我想根据用户组的用户选择它们。
基本上我想模拟像.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?
}
}
答案 0 :(得分:2)
尝试将其转换为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连接。