Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# FirstOrDefault linq扩展默认项为null,即使声明_C#_Asp.net Mvc_Linq - Fatal编程技术网

C# FirstOrDefault linq扩展默认项为null,即使声明

C# FirstOrDefault linq扩展默认项为null,即使声明,c#,asp.net-mvc,linq,C#,Asp.net Mvc,Linq,我的最终实现略有不同,但我的问题是testSetting应该是ObjectSetting类型的填充对象,其值为“false”。如果linq表达式的结果为空,则我得到的结果是testSetting为null 我已经检查了S/O中的类似情况,我也检查了msdn文档,我觉得我的实现是正确的,但显然我不是。您使用的是带有谓词的FirstOrDefault,因此如果您的obj.ObjectSettings不是空的,但是匹配的值中没有一个具有ObjectTypeSetting.Name的“PropName”

我的最终实现略有不同,但我的问题是testSetting应该是ObjectSetting类型的填充对象,其值为“false”。如果linq表达式的结果为空,则我得到的结果是testSetting为null


我已经检查了S/O中的类似情况,我也检查了msdn文档,我觉得我的实现是正确的,但显然我不是。

您使用的是带有谓词的
FirstOrDefault
,因此如果您的
obj.ObjectSettings
不是空的,但是匹配的值中没有一个具有
ObjectTypeSetting.Name
“PropName”
,您仍然会以没有结果而告终

如果您希望在这种情况下获得默认设置,应使用:

ObjectSetting defaultSetting = new ObjectSetting();
defaultSetting.Value = "false";
defaultSetting.ObjectTypeSetting = db.ObjectSettings.First(ots => ots.Name == "PropName");

ObjectSetting testSetting = obj.ObjectSettings.DefaultIfEmpty(defaultSetting)
     .FirstOrDefault(os => os.ObjectTypeSetting.Name == "PropName");

对于将来的问题,如果您能够提供一个简短但完整的实现,那么这将非常有帮助,并且在示例代码中使用较短的名称将有助于在堆栈溢出上相对狭窄的可用空间中提高可读性??默认设置@Ryan:是的,这也是一个选项。
var testSetting = obj.ObjectSettings
                     .Where(os => os.ObjectTypeSetting.Name == "PropName")
                     .DefaultIfEmpty(defaultSetting)
                     .First();