试图简化LINQ表达式
本文关键字:LINQ 表达式 | 更新日期: 2023-09-27 18:15:42
我正在尝试简化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",并且与Profiles有关系。
所以我想要的是所有的结果从查询具有相同的配置文件过滤。配置文件有AND,我也想从查询的所有结果,没有任何配置文件。
尝试如下:
var filterProfileIds = filter.Profiles.Select(s => s.ProfileId);
query = query.Where(w =>
!w.Profiles.Any() ||
w.Profiles.Any(i => filterProfileIds.Contains(i.ProfileId))
).ToList();
如果我正确理解了需求,您可以使用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));
可以这样写:
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();