LINQ子列表<>有时会返回“NULL”

时间:2014-07-18 19:34:31

标签: c# linq

我有一个LINQ查询,其中包含一个子列表,有时可以不返回任何返回,但是无法设置获取实际的null而不是错误。 任何帮助都会受到影响。

        var member_settings = from ml in _pMetaLanguages
                     join s in _settings
                     on ml.id equals s.setting_type_id
                              orderby ml.name descending
                     select new _class {
                         group_name = ml.name
                         , code = (ml.classes.Where(c => c.id == s.int_value)).FirstOrDefault().code
                         , name = (ml.classes.Where(c => c.id == s.int_value)).FirstOrDefault().name
                         , id = (ml.classes.Where(c => c.id == s.int_value)).FirstOrDefault().id
                         ,
                         classUI = ml.metadataMUI
                         ,
                         nameUI = ml.metadataMUI.Where(u => u.language_type_id.Equals(list_language_id))
                           .Select(i => new pMetaClasses
                           {
                               name = i.classes.Where(y => (y.bound_id.Equals(list_language_id))).FirstOrDefault().name
                           }).FirstOrDefault().name
                         , setting_type_id = s.setting_type_id
                         , int_value = s.int_value 
                     };

EDITED

这部分提出了问题

nameUI = ml.metadataMUI.Where(u => u.language_type_id.Equals(list_language_id))
                       .Select(i => new pMetaClasses
                       {
                           name = i.classes.Where(y => (y.bound_id.Equals(list_language_id))).FirstOrDefault().name
                       }).FirstOrDefault().name

" metadataMUI"有时有记录但不总是,当没有记录时它应该为空(至少没有错误......

1 个答案:

答案 0 :(得分:3)

您有一组对象,它可能是空的也可能不是。您想要从该集合中的第一个项目中提取属性(如果有)。目前,只要您的查询遇到此问题,您就会使用这种通用方法:

sequence.FirstOrDefault().SomeMember

如果序列始终包含项目,则此代码可以正常工作。如果它可能是空的,它就不起作用。 (除非你可以并且想要获得默认值的成员。对于参考类型,正如你明确使用的那样,这只会导致空引用删除。)幸运的是,有一个简单的转换以确保它正常工作。只需使用Select将序列转换为您感兴趣的子属性,然后获取该序列的第一个或默认值:

sequence.Select(item => item.SomeMember).FirstOrDefault();

无论是否有物品,这都能正常运作。使用这种方法永远不会在默认值上调用投影。

当然,您可以在很多地方执行此操作,因此您需要在整个查询过程中进行此转换。