我有一个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"有时有记录但不总是,当没有记录时它应该为空(至少没有错误......
答案 0 :(得分:3)
您有一组对象,它可能是空的也可能不是。您想要从该集合中的第一个项目中提取属性(如果有)。目前,只要您的查询遇到此问题,您就会使用这种通用方法:
sequence.FirstOrDefault().SomeMember
如果序列始终包含项目,则此代码可以正常工作。如果它可能是空的,它就不起作用。 (除非你可以并且想要获得默认值的成员。对于参考类型,正如你明确使用的那样,这只会导致空引用删除。)幸运的是,有一个简单的转换以确保它正常工作。只需使用Select
将序列转换为您感兴趣的子属性,然后获取该序列的第一个或默认值:
sequence.Select(item => item.SomeMember).FirstOrDefault();
无论是否有物品,这都能正常运作。使用这种方法永远不会在默认值上调用投影。
当然,您可以在很多地方执行此操作,因此您需要在整个查询过程中进行此转换。