C# 首先是Enum throw“;序列不包含任何元素”;

C# 首先是Enum throw“;序列不包含任何元素”;,c#,dynamic,ienumerable,C#,Dynamic,Ienumerable,我有后续代码: if ( myList.Where ( .. condition .. ).Where ( .. another condition .. ).Any() ) { var element = myList.Where ( .. condition .. ).Where ( .. another condition .. ).First().Elements ; ..some logic over element .. } 我在IF语句的第一行得到异常“Se

我有后续代码:

if ( myList.Where ( .. condition .. ).Where ( .. another condition .. ).Any() )
{
     var element = myList.Where ( .. condition .. ).Where ( .. another condition .. ).First().Elements ;

     ..some logic over element ..
}
我在IF语句的第一行得到异常“Sequence contains no elements”

myList是一个
列表
,其中MyObject继承了form ExpandooObject,并有一个名为Elements的getter,它将以动态方式转换的对象返回给我

按要求编辑我尝试在任何和第一次执行的查询中获取更多详细信息

myList.Where ( x => x.Child.Name.Equal ( "Name" ).Where ( x => x.Elements.Value == myValue )

试着这样做:

var myValue = myList.Where(..condition..).Where(..another condition..).FirstOrDefault();
if ( myValue != null )
{
     var element = myValue.Elements ;
     ..some logic over element ..
}
var thing = myList.Where ( .. condition .. ).Where ( .. another condition .. ).FirstOrDefault();

if (thing != null)
{
    var element = thing.Element;
    ..some logic over element ..
}
您可以使用这样一个事实:如果没有结果,您将得到一个null,并根据null进行检查,而不是执行两次查询。另外,如果您需要更改查询,您只有一个地方可以更改它


我猜想您的错误是由于前面的谓词在
.Any()
.First()

中稍有不同造成的。您必须使用
FirstOrDefault()


问题是在调用
First()
之前,没有任何内容与您的
where
条件匹配。鉴于您没有显示实际的代码,很难判断条件是否相同,但最好的方法是像这样重新编写:

var myValue = myList.Where(..condition..).Where(..another condition..).FirstOrDefault();
if ( myValue != null )
{
     var element = myValue.Elements ;
     ..some logic over element ..
}
var thing = myList.Where ( .. condition .. ).Where ( .. another condition .. ).FirstOrDefault();

if (thing != null)
{
    var element = thing.Element;
    ..some logic over element ..
}

这样做的好处是不会重复两次
where
条件,并保存输入源的双重枚举,这取决于
myList
的实际内容,可能会导致性能损失。

请显示a-除其他外,我们不知道这两行之间的条件是否相同,以及数据源是否稳定。(一般来说,我建议避免这种双重评估…)那么,你在寻找什么解释?没有满足您筛选条件的项。你为什么要先做
Any
+
First
,而不是先做
First或default
。为什么要编写
sequence.Where(condition).Any()
而不是
sequence.Any(condition)
?@JonSkeet查询是相同的,但并不一定意味着结果是相同的。。。