试图简化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,我也想从查询的所有结果,没有任何配置文件。

试图简化LINQ表达式

尝试如下:

var filterProfileIds = filter.Profiles.Select(s => s.ProfileId);
query = query.Where(w => 
                    !w.Profiles.Any() || 
                     w.Profiles.Any(i => filterProfileIds.Contains(i.ProfileId))
                ).ToList();

如果我正确理解了需求,您可以使用AnyAll扩展方法的组合,如下所示:

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();