LINQ子列表<>有时返回"NULL"
本文关键字:quot 返回 NULL 列表 LINQ | 更新日期: 2023-09-27 18:13:28
我有一个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
};
编辑这部分给出了问题
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"有时有记录,但并非总是如此,当没有记录时,它应该是空的(至少没有错误…
您有一个对象集合,它可能为空,也可能不为空。您希望从该集合中的第一个项目(如果有)中取出一个属性。目前,当你的查询遇到这个问题时,你使用的一般方法是:
sequence.FirstOrDefault().SomeMember
如果序列总是包含一个项,则此代码可以正常工作。如果它可能是空的,它就不起作用。(除非您能够并且希望获得默认值的成员。对于引用类型,正如您正在使用的,这只会导致null引用异常。)幸运的是,有一个简单的转换可以确保它正确工作。只需使用Select
将序列转换为您感兴趣的子属性,然后然后获得该序列的第一个值或默认值:
sequence.Select(item => item.SomeMember).FirstOrDefault();
无论是否有项,都将正常工作。使用这种方法永远不会对默认值调用投影。
当然,您在很多地方都这样做,所以您需要在整个查询中进行此转换。