根据子对象字段值

时间:2015-12-08 14:40:24

标签: c# linq

我需要返回所有具有某个字段的子对象的对象!= null。

注意:EpicStoryId是可以为空的int(如'int?')

我试过了:

return _context.Features
            .Where(x => x.UserStories.Any(us => us.EpicStoryId.HasValue) 
                && x.Id == Id)
            .FirstOrDefault();

我尝试过:

return _context.Features
            .Where(x => x.UserStories.Any(us => us.EpicStoryId != null) 
                && x.Id == Id)
            .FirstOrDefault();

并且措施良好:

return _context.Features
            .Where(x => x.UserStories.Any(us => us.EpicStoryId.HasValue == false) 
                && x.Id == Id)
            .FirstOrDefault();

最后:

return _context.Features
            .Where(x => x.UserStories.Any(us => us.EpicStoryId > 0) 
                && x.Id == Id)
            .FirstOrDefault();

但这些都不起作用。无论孩子是否具有Id=Id的值,它仍然会使用EpicStoryId返回每个“功能”。 (仅供参考,我查看了数据,并且某些EpicStoryId的值为空值。)

示例数据:

enter image description here

2 个答案:

答案 0 :(得分:2)

Any将返回true,任何1 EpicStoryId都有值,这样您的情况就会失败。

All应该: -

return _context.Features
               .FirstOrDefault(x => x.UserStories.All(us => us.EpicStoryId.HasValue) 
                    && x.Id == Id);

答案 1 :(得分:0)

如果您需要返回所有对象,请不要使用FirstOrDefault(),请使用.Where().ToList()方法的组合:

对于我们的 任何 ,EpicStoryIds不是空使用:

return _context.Features
            .Where(x => x.Id == Id && x.UserStories.Any(us => us.EpicStoryId.HasValue))
            .ToList();

对于我们的 所有 ,EpicStoryIds不为null,您可以使用:

return _context.Features
            .Where(x => x.Id == Id && x.UserStories.All(us => us.EpicStoryId.HasValue))
            .ToList();

如果您想要返回UserStories而不是Features的列表,可以使用:

return _context.Features
            .Where(x => x.Id == Id)
            .SelectMany(x => x.UserStories
              .Where(us => us.EpicStoryId.HasValue))
            .ToList();