试图简化LINQ表达式

时间:2016-11-01 10:20:11

标签: c# .net linq

我正在尝试简化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具有相同配置文件的查询的所有结果,并且我还希望查询中的所有结果都没有任何配置文件。

3 个答案:

答案 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)

如果我正确理解了该要求,您可以使用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));

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