我正在尝试简化LINQ表达式,但无论我尝试什么,我都无法让它工作
var filterProfileIds = filter.Profiles.Select(s => s.ProfileId);
var newList = new List<FileMedia>();
foreach (var item in filterProfileIds)
{
newList.AddRange(query.Where(w => w.Profiles.Select(s => s.ProfileId).Contains(item)));
}
newList.AddRange(query.Where(w => !w.Profiles.Any()));
query = newList.AsQueryable();
查询的类型为“FileMedia”,与“个人档案”有关。
所以我想要的是具有与filter.profiles具有相同配置文件的查询的所有结果,并且我还希望查询中的所有结果都没有任何配置文件。
答案 0 :(得分:2)
尝试如下:
var filterProfileIds = filter.Profiles.Select(s => s.ProfileId);
query = query.Where(w =>
!w.Profiles.Any() ||
w.Profiles.Any(i => filterProfileIds.Contains(i.ProfileId))
).ToList();
答案 1 :(得分:1)
如果我正确理解了该要求,您可以使用Any
和All
扩展方法的组合,如下所示:
query = query.Where(m => !m.Profiles.Any() ||
filterProfileIds.All(id => m.Profiles.Any(p => p.ProfiledId == id)));
如果您希望获得与过滤器具有完全相同的配置文件的项目。
如果你确实想要获得包含在过滤器中的任何配置文件的项目,那么你可以改用它:
query = query.Where(m => !m.Profiles.Any() ||
m.Profiles.Any(p => filterProfileIds.Contains(p.ProfiledId));
答案 2 :(得分:0)
也许是这样的:
query = (from item in filter.Profiles.Select(s => s.ProfileId)
from fileMedia in query
where fileMedia.Profiles.Select(q => q.ProfileId).Contains(item)
select fileMedia).
Concat(query.Where(w => !w.Profiles.Any())).AsQueryable();